lambda
est une fonction anonyme, elle équivaut à:
def func(p):
return p.totalScore
Devient maintenant max
:
max(players, key=func)
Mais comme les def
instructions sont des instructions composées, elles ne peuvent pas être utilisées lorsqu'une expression est requise, c'est pourquoi les instructions sont parfois lambda
utilisées.
Notez que cela lambda
équivaut à ce que vous mettriez dans une instruction return d'un def
. Ainsi, vous ne pouvez pas utiliser d'instructions dans un lambda
, seules les expressions sont autorisées.
Que fait max
-on?
max (a, b, c, ... [, clé = func]) -> valeur
Avec un seul argument itérable, renvoie son plus grand élément. Avec deux arguments ou plus, renvoie le plus grand argument.
Ainsi, il renvoie simplement l'objet qui est le plus grand.
Comment ça key
marche?
Par défaut, dans 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 supérieure à un entier).
Pour modifier l'objet avant la comparaison, ou pour comparer en fonction d'un attribut / index particulier, vous devez utiliser l' key
argument.
Exemple 1:
Un exemple simple, supposons que vous ayez une liste de nombres sous forme de chaîne, mais que vous souhaitiez 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 afin que vous les obteniez '2'
en sortie):
>>> max(lis)
'2'
Pour comparer les éléments par leur valeur entière, utilisez key
un simple lambda
:
>>> max(lis, key=lambda x:int(x))
'111'
Exemple 2: application 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 index. Si le premier index est le même, il comparera le deuxième index. Comme dans mon exemple, tous les éléments ont un premier index unique, vous obtiendrez donc ceci comme réponse:
>>> max(lis)
(4, 'e')
Mais que se passe-t-il si vous souhaitez comparer chaque élément par la valeur à l'index 1? Simple: utilisez lambda
:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
Comparaison d'éléments dans un itérable contenant des objets de type différent :
Liste avec des éléments mixtes:
lis = ['1','100','111','2', 2, 2.57]
Dans Python 2, il est possible de comparer des éléments de deux types différents :
>>> max(lis)
'2'
>>> max(lis, key=lambda x: int(x))
'111'
Mais dans Python 3, vous ne pouvez plus faire cela :
>>> 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()
Mais cela fonctionne, car nous comparons la version entière de chaque objet:
>>> max(lis, key=lambda x: int(x))
'111'