Pythons effizienteste Methode zur Auswahl der längsten Zeichenfolge in der Liste?

254

Ich habe eine Liste mit variabler Länge und versuche zu testen, ob das aktuell ausgewertete Listenelement die längste in der Liste enthaltene Zeichenfolge ist. Und ich benutze Python 2.6.1

Beispielsweise:

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

Sicher gibt es ein einfaches Listenverständnis, das kurz und elegant ist und das ich übersehen habe?

user104997
quelle

Antworten:

620

In der Python-Dokumentation selbst können Sie Folgendes verwenden max:

>>> mylist = ['123','123456','1234']
>>> print max(mylist, key=len)
123456
Paolo Bergantino
quelle
1
Funktioniert nicht für Python 2.4. In diesem Beitrag und in diesem Beitrag finden Sie Code, der unter 2.4 implementiert werden soll.
Kumba
13
Es wird nur die erste längste Zeichenfolge zurückgegeben: Beispielsweise wird print(max(["this", "does", "work"], key=len))nur zurückgegeben, "this"anstatt alle längsten Zeichenfolgen zurückzugeben.
Anderson Green
das Gleiche gilt für @AndersonGreen. Kann die Methode so erneut bereitgestellt werden, dass zwei + Elemente der Liste, die den Aufruf (Schlüssel) erfüllen, gleich gut erfasst werden?
David Shaked
Im Anschluss an meine Frage von früher habe ich eine Antwort verlinkt, die das Problem des ersten Punktes, wenn alles andere gleich ist, behebt ...
David Shaked
4
Um jedes größte Element in linearer Zeit zu erhalten, müssen Sie dies tun m=max(map(len,xs)); [x for x in xs if len(x) == m]. Ich denke nicht, dass es gut in einer Zeile gemacht werden kann.
Thomas Ahle
6

Was sollte passieren, wenn mehr als eine längste Zeichenfolge vorhanden ist (denken Sie an '12' und '01')?

Versuchen Sie das, um das längste Element zu erhalten

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

Und dann regelmäßig foreach

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

oder viel einfacher:

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

Verwenden Sie die integrierten Min- und Max-Funktionen, um das kleinste oder größte Element in einer Liste zu erhalten:

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

Wie beim Sortieren können Sie ein "Schlüssel" -Argument übergeben, mit dem die Listenelemente vor dem Vergleich zugeordnet werden:

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

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

Sieht so aus, als könnten Sie die Max-Funktion verwenden, wenn Sie sie für Zeichenfolgen korrekt zuordnen und als Vergleich verwenden. Ich würde natürlich empfehlen, das Maximum nur einmal zu finden, nicht für jedes Element in der Liste.

Gavin H.
quelle
2

len(each) == max(len(x) for x in myList) oder nur each == max(myList, key=len)

HarryM
quelle
4
Können Sie eine kurze Erklärung geben?
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
quelle