lambda ist eine anonyme Funktion und entspricht:
def func(p):
return p.totalScore
Jetzt maxwird:
max(players, key=func)
Da defAnweisungen zusammengesetzte Anweisungen sind, können sie nicht verwendet werden, wenn ein Ausdruck erforderlich ist. Deshalb werden manchmal auch Anweisungen lambdaverwendet.
Beachten Sie, dass dies dem lambdaentspricht, 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 maxdas
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 keyvergleicht 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 keyArgument 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 maxdie 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 keyFolgendes lambda:
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
Beispiel 2: Anwenden maxauf eine Liste von Tupeln.
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
Standardmäßig maxwerden 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'