lambda
est une fonction anonyme, équivalente à :
def func(p):
return p.totalScore
Maintenant max
devient :
max(players, key=func)
Cependant, comme les instructions def
sont des instructions composées qui ne peuvent pas être utilisées là où une expression est requise, c'est pourquoi parfois on utilise des lambda
.
Remarquez que lambda
est équivalent à ce que vous mettriez dans une instruction return d'une def
. Ainsi, vous ne pouvez pas utiliser d'instructions à l'intérieur d'un lambda
, seules des expressions sont autorisées.
Que fait max
?
max(a, b, c, ...[, key=func]) -> value
Avec un seul argument itérable, retourne son élément le plus grand. Avec deux arguments ou plus, retourne le plus grand argument.
Ainsi, il retourne simplement l'objet qui est le plus grand.
Comment fonctionne key
?
Par défaut en Python 2, key
compare les éléments en fonction d'un ensemble de règles basées sur le type des objets (par exemple, une chaîne est toujours plus grande qu'un entier).
Pour modifier l'objet avant la comparaison, ou pour comparer en fonction d'un attribut/index particulier, vous devez utiliser l'argument key
.
Exemple 1 :
Un exemple simple, supposons que vous ayez une liste de nombres sous forme de chaîne, mais que vous vouliez comparer ces éléments par leur valeur entière.
>>> lis = ['1', '100', '111', '2']
Ici, max
compare les éléments en utilisant leurs valeurs d'origine (les chaînes sont comparées lexicographiquement donc vous obtiendriez '2'
en sortie) :
>>> max(lis)
'2'
Pour comparer les éléments par leur valeur entière, utilisez key
avec un simple lambda
:
>>> max(lis, key=lambda x:int(x)) # comparer la version `int` de chaque élément
'111'
Exemple 2 : Application de max
à une liste de tuples.
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
Par défaut, max
comparera les éléments par le premier indice. Si le premier indice est le même, il comparera le deuxième indice. Dans mon exemple, tous les éléments ont un premier indice unique, donc vous obtiendriez ceci comme réponse :
>>> max(lis)
(4, 'e')
Mais, que faire si vous vouliez comparer chaque élément par la valeur à l'index 1 ? Simple : utilisez lambda
:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
Comparaison des éléments dans un itérable contenant des objets de types différents :
Liste avec des éléments mixtes :
lis = ['1','100','111','2', 2, 2.57]
En Python 2, il est possible de comparer des éléments de types différents :
>>> max(lis) # fonctionne en Python 2
'2'
>>> max(lis, key=lambda x: int(x)) # comparer la version entière de chaque élément
'111'
Mais en Python 3, ce n'est plus possible :
>>> lis = ['1', '100', '111', '2', 2, 2.57]
>>> max(lis)
Traceback (most recent call last):
File "", line 1, in
max(lis)
TypeError: unorderable types: int() > str()
Mais cela fonctionne, car nous comparons la version entière de chaque objet :
>>> max(lis, key=lambda x: int(x)) # ou simplement `max(lis, key=int)`
'111'