A maneira mais eficiente do Python de escolher a string mais longa da lista?

254

Eu tenho uma lista de comprimento variável e estou tentando encontrar uma maneira de testar se o item da lista que está sendo avaliado atualmente é a string mais longa contida na lista. E eu estou usando o Python 2.6.1

Por exemplo:

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

Certamente há uma compreensão simples da lista que é curta e elegante que estou ignorando?

user104997
fonte

Respostas:

620

Na própria documentação do Python , você pode usar max:

>>> mylist = ['123','123456','1234']
>>> print max(mylist, key=len)
123456
Paolo Bergantino
fonte
1
Não funciona no Python 2.4. Veja esta publicação e esta publicação para código a ser implementado em 2.4.
Kumba
13
Ele retorna apenas a primeira cadeia mais longa: por exemplo, print(max(["this", "does", "work"], key=len))somente retorna em "this"vez de retornar todas as cadeias mais longas.
Anderson Green
idem @AndersonGreen. O método pode ser reimplantado de forma a capturar dois + elementos da lista que atendem igualmente à chamada (chave)?
David Shaked
Dando seguimento a minha pergunta de mais cedo, eu ligada uma resposta que os remédios o primeiro-item--se tudo-else-iguais problema ...
David Shaked
4
Para obter todos os elementos maiores, em tempo linear, você precisa m=max(map(len,xs)); [x for x in xs if len(x) == m]. Eu não acho que isso possa ser feito bem em uma linha.
Thomas Ahle 29/03
6

O que deve acontecer se houver mais de uma string mais longa (pense em '12' e '01')?

Tente isso para obter o elemento mais longo

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

E depois foreach regular

for st in mylist:
    if len(st)==max_length:...
Elazar Leibovich
fonte
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 muito mais fácil:

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

Para obter o item menor ou maior de uma lista, use as funções mín e máx internas:

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

Assim como na classificação, você pode passar um argumento "chave" usado para mapear os itens da lista antes de serem comparados:

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

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

Parece que você poderia usar a função max se mapeá-la corretamente para seqüências de caracteres e usá-la como comparação. Eu recomendaria apenas encontrar o máximo uma vez, é claro, não para cada elemento da lista.

Gavin H
fonte
2

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

HarryM
fonte
4
você pode fornecer uma breve explicação?
precisa saber é o seguinte
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
fonte