lambda
ist eine anonyme Funktion und entspricht:
def func(p):
return p.totalScore
Jetzt max
wird:
max(players, key=func)
Da def
Anweisungen zusammengesetzte Anweisungen sind, können sie nicht verwendet werden, wenn ein Ausdruck erforderlich ist. Deshalb werden manchmal auch Anweisungen lambda
verwendet.
Beachten Sie, dass dies dem lambda
entspricht, was Sie in eine return-Anweisung von a eingefügt haben def
. Daher können Sie keine Anweisungen in a verwenden lambda
, nur Ausdrücke sind zulässig.
Was macht max
das
max (a, b, c, ... [, key = func]) -> Wert
Geben Sie mit einem einzigen iterierbaren Argument das größte Element zurück. Geben Sie mit zwei oder mehr Argumenten das größte Argument zurück.
Es wird also einfach das größte Objekt zurückgegeben.
Wie funktioniert das key
?
Standardmäßig key
vergleicht Python 2 Elemente basierend auf einer Reihe von Regeln, die auf dem Typ der Objekte basieren (z. B. ist eine Zeichenfolge immer größer als eine Ganzzahl).
Um das Objekt vor dem Vergleich zu ändern oder anhand eines bestimmten Attributs / Index zu vergleichen, müssen Sie das key
Argument verwenden.
Beispiel 1:
Angenommen, Sie haben eine Liste von Zahlen in Zeichenfolgenform, möchten diese Elemente jedoch anhand ihres ganzzahligen Werts vergleichen.
>>> lis = ['1', '100', '111', '2']
Hier werden max
die Elemente anhand ihrer ursprünglichen Werte verglichen (Zeichenfolgen werden lexikografisch verglichen, sodass Sie sie '2'
als Ausgabe erhalten):
>>> max(lis)
'2'
Um die Elemente anhand ihres ganzzahligen Werts zu vergleichen, verwenden Sie key
Folgendes lambda
:
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
Beispiel 2: Anwenden max
auf eine Liste von Tupeln.
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
Standardmäßig max
werden die Elemente anhand des ersten Index verglichen. Wenn der erste Index identisch ist, wird der zweite Index verglichen. Wie in meinem Beispiel haben alle Elemente einen eindeutigen ersten Index, sodass Sie diesen als Antwort erhalten:
>>> max(lis)
(4, 'e')
Was aber, wenn Sie jedes Element anhand des Werts bei Index 1 vergleichen möchten? Einfach: verwenden lambda
:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
Vergleichen von Elementen in einer Iterable, die Objekte unterschiedlichen Typs enthält :
Liste mit gemischten Elementen:
lis = ['1','100','111','2', 2, 2.57]
In Python 2 können Elemente zweier verschiedener Typen verglichen werden :
>>> max(lis) # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x)) # compare integer version of each item
'111'
Aber in Python 3 können Sie das nicht mehr tun :
>>> lis = ['1', '100', '111', '2', 2, 2.57]
>>> max(lis)
Traceback (most recent call last):
File "<ipython-input-2-0ce0a02693e4>", line 1, in <module>
max(lis)
TypeError: unorderable types: int() > str()
Dies funktioniert jedoch, da wir die Ganzzahlversion jedes Objekts vergleichen:
>>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)`
'111'