Najskuteczniejszy sposób Pythona na wybór najdłuższego ciągu na liście?

254

Mam listę o zmiennej długości i próbuję znaleźć sposób, aby sprawdzić, czy aktualnie oceniany element listy jest najdłuższym ciągiem zawartym na liście. I używam Python 2.6.1

Na przykład:

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

Z pewnością przeoczyłem proste, krótkie i eleganckie zestawienie list, które przeoczam?

użytkownik104997
źródło

Odpowiedzi:

619

Z samej dokumentacji Pythona możesz użyć max:

>>> mylist = ['123','123456','1234']
>>> print max(mylist, key=len)
123456
Paolo Bergantino
źródło
1
Nie działa dla Python 2.4. Zobacz ten i ten post kod do wdrożenia w 2.4.
Kumba
13
Zwraca tylko pierwszy najdłuższy ciąg: na przykład print(max(["this", "does", "work"], key=len))zwraca tylko "this"zamiast zwracać wszystkie najdłuższe ciągi.
Anderson Green
to samo @AndersonGreen. Czy metodę można wdrożyć w taki sposób, aby równie dobrze wychwycić dwa + elementy listy odpowiadające wywołaniu (kluczowi)?
David Shaked
W odpowiedzi na moje wcześniejsze pytanie połączyłem odpowiedź, która rozwiązuje problem równości pierwszego elementu, jeśli wszystko inne ...
David Shaked
4
Aby uzyskać każdy największy element, w czasie liniowym, musisz zrobić m=max(map(len,xs)); [x for x in xs if len(x) == m]. Nie sądzę, że można to zrobić ładnie w jednej linii.
Thomas Ahle
6

Co powinno się stać, jeśli istnieje więcej niż 1 najdłuższy ciąg (pomyśl „12” i „01”)?

Spróbuj, aby uzyskać najdłuższy element

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

A potem regularne foreach

for st in mylist:
    if len(st)==max_length:...
Elazar Leibovich
źródło
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)

lub znacznie łatwiej:

max(some_list , key = len)
Саво Вуковић
źródło
4

Aby uzyskać najmniejszy lub największy element na liście, użyj wbudowanych funkcji min i max:

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

Podobnie jak w przypadku sortowania, możesz przekazać argument „klucz”, który służy do mapowania elementów listy przed ich porównaniem:

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

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

Wygląda na to, że możesz użyć funkcji max, jeśli poprawnie odwzorujesz ją na ciągi znaków i użyjesz jej jako porównania. Oczywiście polecam po prostu znaleźć maksimum raz, nie dla każdego elementu na liście.

Gavin H.
źródło
2

len(each) == max(len(x) for x in myList) Lub tylko each == max(myList, key=len)

HarryM
źródło
4
czy możesz podać krótkie wyjaśnienie?
David Shaked
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
źródło