lambda
jest funkcją anonimową, jest odpowiednikiem:
def func(p):
return p.totalScore
Teraz max
staje się:
max(players, key=func)
Ponieważ jednak def
instrukcje są instrukcjami złożonymi, nie można ich używać tam, gdzie wymagane jest wyrażenie, dlatego czasami lambda
są używane.
Zauważ, że lambda
jest to równoważne temu, co umieściłeś w instrukcji zwrotu pliku def
. Dlatego nie możesz używać instrukcji wewnątrz a lambda
, dozwolone są tylko wyrażenia.
Co robi max
?
max (a, b, c, ... [, klucz = func]) -> wartość
Za pomocą pojedynczego iterowalnego argumentu zwróć jego największy element. W przypadku dwóch lub więcej argumentów zwraca największy argument.
Więc po prostu zwraca obiekt, który jest największy.
Jak to key
działa?
Domyślnie w Pythonie 2 key
porównuje elementy w oparciu o zestaw reguł opartych na typie obiektów (na przykład łańcuch jest zawsze większy niż liczba całkowita).
Aby zmodyfikować obiekt przed porównaniem lub porównać na podstawie określonego atrybutu / indeksu, musisz użyć key
argumentu.
Przykład 1:
Prosty przykład: załóżmy, że masz listę liczb w postaci ciągu, ale chcesz porównać te elementy według ich wartości całkowitych.
>>> lis = ['1', '100', '111', '2']
Tutaj max
porównuje elementy przy użyciu ich oryginalnych wartości (łańcuchy są porównywane leksykograficznie, aby uzyskać '2'
wynik):
>>> max(lis)
'2'
Aby porównać elementy według ich wartości całkowitej, użyj key
prostego lambda
:
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
Przykład 2: zastosowanie max
do listy krotek.
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
Domyślnie max
porównuje elementy według pierwszego indeksu. Jeśli pierwszy indeks jest taki sam, porówna drugi indeks. Tak jak w moim przykładzie, wszystkie elementy mają unikalny pierwszy indeks, więc otrzymasz odpowiedź:
>>> max(lis)
(4, 'e')
Ale co by było, gdybyś chciał porównać każdą pozycję według wartości pod indeksem 1? Proste: użycie lambda
:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
Porównanie elementów w iterowalnej, która zawiera obiekty różnego typu :
Lista z elementami mieszanymi:
lis = ['1','100','111','2', 2, 2.57]
W Pythonie 2 możliwe jest porównanie elementów dwóch różnych typów :
>>> max(lis) # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x)) # compare integer version of each item
'111'
Ale w Pythonie 3 nie możesz już tego robić :
>>> 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()
Ale to działa, ponieważ porównujemy wersję całkowitą każdego obiektu:
>>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)`
'111'