fonction Python max utilisant l'expression " key " et lambda
je viens d'OOP background et j'essaie d'apprendre le python.
J'utilise la fonction max
qui utilise une expression lambda pour renvoyer l'instance de type Player
ayant un maximum totalScore
dans la liste players
.
def winner():
w = max(players, key=lambda p: p.totalScore)
la fonction renvoie correctement l'instance de type Player
ayant un maximum totalScore
.
Je suis confus au sujet des trois choses suivantes:
- Comment fait le
max
fonction de travail? Quels sont les arguments qu'il prend? J'ai regardé la documentation mais je n'ai pas compris. - Quelle est l'utilisation du mot-clé
key
dans la fonction max? Je sais que c'est aussi utilisé dans le contexte desort
fonction - sens de l'expression lambda? Comment les lire? Comment fonctionnent-ils?
ce sont des questions conceptuelles très bruyantes, mais qui m'aideront à comprendre le langage. Il aiderait si vous pourriez donner des exemples pour expliquer. Merci
6 réponses
lambda
est une fonction anonyme, elle est équivalente à:
def func(p):
return p.totalScore
maintenant max
devient:
max(players, key=func)
mais comme def
déclarations sont des déclarations composées qu'ils ne peuvent pas être utilisés où une expression est requise, c'est pourquoi parfois lambda
's sont utilisés.
notez que lambda est équivalent à ce que vous auriez mis dans une déclaration de retour d'un def
. Ainsi, vous ne pouvez pas utiliser déclarations dans un lambda
, seules les expressions sont autorisées.
que fait max?
max (a, b, c,...[, key=func]) -> valeur
avec un seul argument itérable, renvoie son article le plus important. Avec deux ou plus d'arguments, de retour le plus grand argument.
ainsi, il retourne simplement l'objet qui est le plus grand.
How `key` works?
par défaut dans la clé Python 2 compare des éléments basés sur un ensemble de règles basé 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 sur la base d'un attribut/index particulier, vous devez utiliser l'argument key
.
exemple 1:
Un exemple simple, supposons que vous avez un liste des nombres sous forme de chaîne, mais vous voulez comparer ces éléments par leur valeur entière.
>>> lis = ['1','100','111','2']
ici max
compare les articles en utilisant leurs valeurs originales(les chaînes sont comparées lexicographiquement de sorte que vous obtiendriez '2'
comme sortie):
>>> max(lis)
'2'
pour comparer les articles par leur valeur entière utiliser la clé avec un simple lambda
:
>>> max(lis, key=lambda x:int(x)) #compare `int` version of each item
'111'
exemple 2: Application de max
à une liste des listes.
>>> 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, puis il comparera le deuxième index. Comme dans mon exemple, tous les éléments ont un premier index unique, donc, vous obtiendriez ce que la réponse:
>>> max(lis)
(4, 'e')
mais, et si vous vouliez comparer chaque article par la valeur à l'index 1? Simple, utiliser lambda
:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
Comparer des éléments dans un itérable qui contient des objets de type différent :
liste avec éléments mélangés:
>>> lis = ['1','100','111','2', 2, 2.57]
en Python 2 Il est possible de comparer des produits de deux types différents :
>>> max(lis) # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x)) #compare integer version of each item
'111'
mais en 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, comme nous comparons la version entière de chaque objet:
>>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)`
'111'
version fortement simplifiée de max
:
def max(items, key=lambda x: x):
current = item[0]
for item in items:
if key(item) > key(current):
current = item
return current
concernant lambda:
>>> ident = lambda x: x
>>> ident(3)
3
>>> ident(5)
5
>>> times_two = lambda x: 2*x
>>> times_two(2)
4
Comment fonctionne la fonction max?
il cherche le" plus grand " article dans un itérable. Je vais supposer que vous peut aussi regarder ce que c'est, mais si pas, c'est quelque chose que vous pouvez passer en boucle, c'est à dire une liste ou une chaîne.
Quelle est l'utilisation de la clé de mot-clé dans la fonction max? Je sais qu'il est également utilisé dans le contexte de la fonction sort
Key
est une fonction lambda cela indiquera max
quels objets dans le itérable sont plus grands que les autres. Disons que si vous triiez un objet que vous avez créé vous-même, et pas quelque chose d'évident, comme des entiers.
sens de l'expression lambda? Comment les lire? Comment fonctionnent-ils?
C'est une question plus large. En termes simples, un lambda est une fonction que vous pouvez passer autour de , et avoir d'autres pièces de code de l'utiliser. Prenez par exemple:
def sum(a, b, f):
return (f(a) + f(b))
Cela prend deux objets, a
et b
, et une fonction f
.
Il appelle f()
sur chaque objet, puis les additionne. Alors regardez cet appel:
>>> sum(2, 2, lambda a: a * 2)
8
sum()
prend 2
, et appelle l'expression lambda. Ainsi f(a)
devient 2 * 2
, qui devient 4. Il le fait ensuite pour b
, et ajoute les deux ensemble.
en termes pas si simples, lambdas viennent de lambda calculus, qui est l'idée d'une fonction qui retourne une fonction; un concept mathématique très cool pour exprimer le calcul. Vous pouvez lire à propos de ce ici , puis en fait comprendre il ici .
il est probablement préférable de lire à ce sujet un peu plus, comme lambdas peut être déroutant, et il n'est pas immédiatement évident quelle est l'utilité qu'ils sont. Vérifier ici .
selon la documentation :
max (itérable [, clé])
max (arg1, arg2, * args [, key])
retourner le le plus grand article dans un itérable ou le plus grand de deux arguments ou plus.si un argument de position est fourni, itérable doit être un non vide itérable (comme un non-vide chaîne, d'un tuple ou une liste). L'élément le plus important dans l'itérable est retourné. Si deux ou plusieurs arguments de position sont fourni, le plus grand des arguments de position est retourné.
l'argument clé optionnel spécifie une fonction de commande d'un seul argument comme pour la liste.sorte.)( L'argument clé, s'il est fourni, doit être sous forme de mots-clés(par exemple,max (A,b,C, key=func)).
ce que cela signifie, c'est que dans votre cas, vous êtes fournir une liste, dans ce cas players
. Ensuite ,la fonction max
itérera sur tous les éléments de la liste et les comparera les uns aux autres pour obtenir un"maximum".
comme vous pouvez l'imaginer, avec un objet complexe comme un player
déterminer sa valeur pour la comparaison est délicat, donc on vous donne l'argument key
pour déterminer comment la fonction max
décidera la valeur de chaque player
. Dans ce cas, vous utilisez une fonction lambda-à-dire "pour chaque p
dans players
obtenir p.totalscore
et utiliser cela comme sa valeur pour la comparaison".
max
fonction est utilisée pour obtenir le maximum de iterable
.
les itérateurs peuvent être des listes, des tuples, des objets dict, etc. Ou même des objets personnalisés, comme dans l'exemple que vous avez fournis.
max(iterable[, key=func]) -> value
max(a, b, c, ...[, key=func]) -> value
With a single iterable argument, return its largest item.
With two or more arguments, return the largest argument.
ainsi, le key=func
nous permet essentiellement de passer un argument optionnel key
à la fonction sur la base de laquelle l'itérateur/les arguments donnés sont triés et le maximum est retourné.
lambda
est un mot-clé python qui agit comme une pseudo fonction. Ainsi, lorsque vous passez player
objet à elle, il retournera player.totalScore
. Ainsi, l'itérable passé à la fonction max
triera selon le key
totalScore des player
objets qui lui sont donnés et retournera le player
qui a maximum totalScore
.
si aucun argument key
n'est fourni, le maximum est retourné par défaut Python rangements.
Exemples
max(1, 3, 5, 7)
>>>7
max([1, 3, 5, 7])
>>>7
people = [('Barack', 'Obama'), ('Oprah', 'Winfrey'), ('Mahatma', 'Gandhi')]
max(people, key=lambda x: x[1])
>>>('Oprah', 'Winfrey')
max
est construit en fonction qui prend le premier argument un iterable
(comme liste ou tuple)
argument de mot-clé key
a sa valeur par défaut None
mais il accepte la fonction d'évaluer, le considèrent comme wrapper qui évalue itérable basée sur la fonction
considérons cet exemple de dictionnaire:
d = {'aim':99, 'aid': 45, 'axe': 59, 'big': 9, 'short': 995, 'sin':12, 'sword':1, 'friend':1000, 'artwork':23}
Ex:
>>> max(d.keys())
'sword'
comme vous pouvez voir si vous ne passez le itérable sans kwarg (une fonction à key
) il renvoie la valeur maximale de la clé (alphabétique)
ex. Au lieu de trouver la valeur max de la clé par ordre alphabétique, vous pourriez avoir besoin de trouver la clé max par longueur de la clé:
>>>max(d.keys(), key=lambda x: len(x))
'artwork'
dans cet exemple, la fonction lambda renvoie la longueur de la clé qui sera itérée par la suite lors de l'évaluation des valeurs au lieu de tenir compte de l'ordre alphabétique, elle gardera la trace de la longueur maximale de la clé et renvoie la clé qui a une longueur maximale de
ex.
>>> max(d.keys(), key=lambda x: d[x])
'friend'
dans cet exemple, la fonction lambda renvoie la valeur de la clé de dictionnaire correspondante qui a la valeur maximale