lambda
è una funzione anonima, equivale a:
def func(p):
return p.totalScore
Ora max
diventa:
max(players, key=func)
Ma poiché le def
dichiarazioni sono istruzioni composte che non possono essere utilizzate dove è richiesta un'espressione, ecco perché a volte lambda
vengono utilizzate.
Nota che lambda
equivale a quello che avresti inserito in una dichiarazione di reso di a def
. Pertanto, non è possibile utilizzare le istruzioni all'interno di a lambda
, sono consentite solo espressioni.
Cosa fa max
?
max (a, b, c, ... [, key = func]) -> valore
Con un singolo argomento iterabile, restituisci il suo oggetto più grande. Con due o più argomenti, restituisce l'argomento più grande.
Quindi, restituisce semplicemente l'oggetto che è il più grande.
Come key
funziona?
Per impostazione predefinita in Python 2 key
confronta gli elementi in base a una serie di regole in base al tipo di oggetti (ad esempio una stringa è sempre maggiore di un numero intero).
Per modificare l'oggetto prima del confronto o per confrontare in base a un particolare attributo / indice, devi usare l' key
argomento.
Esempio 1:
Un semplice esempio, supponiamo di avere un elenco di numeri in forma di stringa, ma si desidera confrontare tali elementi con il loro valore intero.
>>> lis = ['1', '100', '111', '2']
Qui max
confronta gli elementi usando i loro valori originali (le stringhe vengono confrontate lessicograficamente in modo da ottenere '2'
come output):
>>> max(lis)
'2'
Per confrontare gli articoli in base al loro valore intero, utilizzare key
con un semplice lambda
:
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
Esempio 2: applicazione max
a un elenco di tuple.
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
Per impostazione predefinita max
confronterà gli articoli con il primo indice. Se il primo indice è lo stesso, confronterà il secondo indice. Come nel mio esempio, tutti gli articoli hanno un primo indice univoco, quindi otterresti questo come risposta:
>>> max(lis)
(4, 'e')
Ma cosa succede se si desidera confrontare ciascun elemento con il valore all'indice 1? Semplice: usare lambda
:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
Confronto di elementi in un iterabile che contiene oggetti di diverso tipo :
Elenco con articoli misti:
lis = ['1','100','111','2', 2, 2.57]
In Python 2 è possibile confrontare elementi di due diversi tipi :
>>> max(lis) # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x)) # compare integer version of each item
'111'
Ma in Python 3 non puoi più farlo :
>>> 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()
Ma funziona, poiché stiamo confrontando la versione intera di ogni oggetto:
>>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)`
'111'