lambda
è una funzione anonima, è equivalente a:
def func(p):
return p.totalScore
Ora max
diventa:
max(players, key=func)
Ma, come def
dichiarazioni sono dichiarazioni composti non possono essere utilizzati in cui l'espressione è richiesto, ecco perché a volte vengono usati gli lambda
.
Si noti che lambda è equivalente a ciò che si inseriva in un estratto conto di def
. Pertanto, non è possibile utilizzare le istruzioni all'interno di lambda
, sono consentite solo le espressioni.
Cosa fa max?
max (a, b, c, ... [, key = FUNC]) -> valore
Con il singolo argomento iterabile, restituisce il suo più grande voce. Con due o altri argomenti, restituisce l'argomento più grande.
Quindi restituisce semplicemente l'oggetto più grande.
How `key` works?
Per default in chiave pitone 2 confronta elementi in base a un set of rules base al tipo di oggetti (per esempio una stringa è sempre maggiore di un numero intero).
Per modificare l'oggetto prima del confronto o confrontare in base a un determinato attributo/indice, è necessario utilizzare l'argomento key
.
Esempio 1:
Un semplice esempio, supponiamo che avete un elenco di numeri in forma di stringa, ma si vuole confrontare gli elementi dal loro valore intero.
>>> lis = ['1','100','111','2']
Qui max
confronta gli oggetti utilizzando i loro valori originali (stringhe vengono confrontate lessicografico modo si otterrebbe '2'
come output):
>>> max(lis)
'2'
Per confrontare gli oggetti dal loro utilizzo chiave valore intero con un semplice lambda
:
>>> max(lis, key=lambda x:int(x)) #compare `int` version of each item
'111'
Esempio 2: Applicazione max
ad una lista di liste.
>>> lis = [(1,'a'),(3,'c'), (4,'e'), (-1,'z')]
Per impostazione predefinita max si confronterà le voci dal primo indice, se il primo indice è lo stesso allora sarebbe confrontare il secondo indice.Come nel mio esempio tutti gli elementi hanno unico primo indice in modo, si otterrebbe questo come la risposta:
>>> max(lis)
(4, 'e')
Ma, cosa succede se si voleva confrontare ogni elemento per il valore di indice 1? Semplice, utilizzare lambda
:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
Confrontando gli elementi in un iterabile che contiene oggetti di diverso tipo:
elenco con gli articoli misti:
>>> lis = ['1','100','111','2', 2, 2.57]
In Python 2 it is possible to compare items of two different types:
>>> max(lis) # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x)) #compare integer version of each item
'111'
But in Python 3 you can't do that any more:
>>> 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 questo funziona, come stiamo confrontando la versione intera di ogni oggetto:
>>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)`
'111'
Quale versione di Python? – charmlessCoin
Hai consultato la [documentazione] (http://docs.python.org/2/library/functions.html#max)? –
@charmlessCoin python 2.7.5 – Vijay