Le moyen le plus efficace de Python pour choisir la chaîne la plus longue de la liste?

254

J'ai une liste de longueur variable et j'essaie de trouver un moyen de tester si l'élément de liste en cours d'évaluation est la plus longue chaîne contenue dans la liste. Et j'utilise Python 2.6.1

Par exemple:

mylist = ['abc','abcdef','abcd']

for each in mylist:
    if condition1:
        do_something()
    elif ___________________: #else if each is the longest string contained in mylist:
        do_something_else()

Il y a sûrement une compréhension de liste simple, courte et élégante que je néglige?

user104997
la source

Réponses:

620

A partir de la documentation Python elle-même, vous pouvez utiliser max:

>>> mylist = ['123','123456','1234']
>>> print max(mylist, key=len)
123456
Paolo Bergantino
la source
1
Ne fonctionnera pas pour Python 2.4. Voir cet article et cet article pour le code à implémenter sous 2.4.
Kumba
13
Il ne renvoie que la première chaîne la plus longue: par exemple, print(max(["this", "does", "work"], key=len))renvoie uniquement "this"au lieu de renvoyer toutes les chaînes les plus longues.
Anderson Green
idem @AndersonGreen. La méthode peut-elle être redéployée d'une manière qui capture également les deux éléments + de la liste répondant à l'appel (clé)?
David Shaked du
Pour faire suite à ma question posée plus tôt, j'ai lié une réponse qui résout le problème du premier élément si tout est égal ...
David Shaked
4
Pour obtenir chaque élément le plus grand, en temps linéaire, vous devez le faire m=max(map(len,xs)); [x for x in xs if len(x) == m]. Je ne pense pas que cela puisse être bien fait en une seule ligne.
Thomas Ahle
6

Que doit-il se passer s'il y a plus d'une chaîne plus longue (pensez à «12» et «01»)?

Essayez cela pour obtenir l'élément le plus long

max_length,longest_element = max([(len(x),x) for x in ('a','b','aa')])

Et puis foreach régulière

for st in mylist:
    if len(st)==max_length:...
Elazar Leibovich
la source
5
def longestWord(some_list): 
    count = 0    #You set the count to 0
    for i in some_list: # Go through the whole list
        if len(i) > count: #Checking for the longest word(string)
            count = len(i)
            word = i
    return ("the longest string is " + word)

ou bien plus simple:

max(some_list , key = len)
Саво Вуковић
la source
4

Pour obtenir le plus petit ou le plus grand élément d'une liste, utilisez les fonctions min et max intégrées:

lo = min(L)
hi = max(L)

Comme pour le tri, vous pouvez passer un argument "clé" qui est utilisé pour mapper les éléments de la liste avant de les comparer:

lo = min(L, key=int)
hi = max(L, key=int)

http://effbot.org/zone/python-list.htm

Il semble que vous puissiez utiliser la fonction max si vous la mappez correctement pour les chaînes et que vous l'utilisez comme comparaison. Je recommanderais simplement de trouver le max une fois bien sûr, pas pour chaque élément de la liste.

Gavin H
la source
2

len(each) == max(len(x) for x in myList) ou juste each == max(myList, key=len)

HarryM
la source
4
pouvez-vous fournir une brève explication?
David Shaked du
1
def LongestEntry(lstName):
  totalEntries = len(lstName)
  currentEntry = 0
  longestLength = 0
  while currentEntry < totalEntries:
    thisEntry = len(str(lstName[currentEntry]))
    if int(thisEntry) > int(longestLength):
      longestLength = thisEntry
      longestEntry = currentEntry
    currentEntry += 1
  return longestLength
Stijn Van den Bruel
la source