¿La forma más eficiente de Python para elegir la cadena más larga de la lista?

254

Tengo una lista de longitud variable y estoy tratando de encontrar una manera de probar si el elemento de la lista que se está evaluando actualmente es la cadena más larga contenida en la lista. Y estoy usando Python 2.6.1

Por ejemplo:

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()

¿Seguramente hay una simple lista de comprensión que es corta y elegante que estoy pasando por alto?

usuario104997
fuente

Respuestas:

620

Desde la documentación de Python , puede usar max:

>>> mylist = ['123','123456','1234']
>>> print max(mylist, key=len)
123456
Paolo Bergantino
fuente
1
No funcionará para Python 2.4. Vea esta publicación y esta publicación para el código a implementar en 2.4.
Kumba
13
Solo devuelve la primera cadena más larga: por ejemplo, print(max(["this", "does", "work"], key=len))solo devuelve en "this"lugar de devolver todas las cadenas más largas.
Anderson Green
lo mismo @AndersonGreen. ¿Se puede volver a implementar el método de una manera que capture dos elementos + de la lista que cumplan la llamada (clave) igualmente bien?
David sacudió el
En seguimiento a mi pregunta de antes, me he vinculado una respuesta que los recursos del primer elemento, si todo lo demás-igual-problema ...
David Shaked
44
Para obtener cada elemento más grande, en tiempo lineal, debe hacerlo m=max(map(len,xs)); [x for x in xs if len(x) == m]. No creo que se pueda hacer bien en una línea.
Thomas Ahle
6

¿Qué debería suceder si hay más de 1 cadena más larga (piense en '12' y '01')?

Prueba eso para obtener el elemento más largo

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

Y luego foreach regular

for st in mylist:
    if len(st)==max_length:...
Elazar Leibovich
fuente
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)

o mucho más fácil:

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

Para obtener el elemento más pequeño o más grande en una lista, use las funciones mínimas y máximas incorporadas:

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

Al igual que con sort, puede pasar un argumento "clave" que se utiliza para asignar los elementos de la lista antes de que se comparen:

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

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

Parece que podría usar la función max si la asigna correctamente para cadenas y la usa como comparación. Sin embargo, recomendaría solo encontrar el máximo una vez, no para cada elemento de la lista.

Gavin H
fuente
2

len(each) == max(len(x) for x in myList) o solo each == max(myList, key=len)

HarryM
fuente
44
¿Puedes dar una breve explicación?
David sacudió el
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
fuente