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:

  1. 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.
  2. Quelle est l'utilisation du mot-clé key dans la fonction max? Je sais que c'est aussi utilisé dans le contexte de sort fonction
  3. 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

116
demandé sur Ashwini Chaudhary 2013-08-18 11:33:12

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'
185
répondu Ashwini Chaudhary 2016-01-22 10:49:25

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
8
répondu Markus Unterwaditzer 2013-08-18 07:40:47

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 .

8
répondu charmlessCoin 2017-05-23 12:34:44

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".

5
répondu Inbar Rose 2013-08-18 07:41:16

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')
4
répondu shad0w_wa1k3r 2013-08-18 08:02:48

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

0
répondu Gahan 2018-04-17 06:38:36