lambda es una función anónima, es equivalente a:
def func(p):
return p.totalScore
Ahora se maxconvierte en:
max(players, key=func)
Pero como las defdeclaraciones son declaraciones compuestas, no se pueden usar donde se requiere una expresión, por eso a veces lambdase usan las.
Tenga en cuenta que lambdaes equivalente a lo que pondría en una declaración de devolución de a def. Por lo tanto, no puede usar declaraciones dentro de a lambda, solo se permiten expresiones.
¿Qué maxhacer?
max (a, b, c, ... [, clave = func]) -> valor
Con un único argumento iterable, devuelve su elemento más grande. Con dos o más argumentos, devuelve el argumento más grande.
Entonces, simplemente devuelve el objeto que es el más grande.
Como keyfunciona
De manera predeterminada, en Python 2 keycompara elementos basados en un conjunto de reglas basadas en el tipo de objetos (por ejemplo, una cadena siempre es mayor que un entero).
Para modificar el objeto antes de la comparación, o para comparar en función de un atributo / índice particular, debe usar el keyargumento.
Ejemplo 1:
Un ejemplo simple, suponga que tiene una lista de números en forma de cadena, pero desea comparar esos elementos por su valor entero.
>>> lis = ['1', '100', '111', '2']
Aquí se maxcomparan los elementos utilizando sus valores originales (las cadenas se comparan lexicográficamente para que se obtenga '2'como salida):
>>> max(lis)
'2'
Para comparar los elementos por su valor entero, use keyuno simple lambda:
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
Ejemplo 2: Aplicar maxa una lista de tuplas.
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
Por defecto maxcomparará los elementos por el primer índice. Si el primer índice es el mismo, comparará el segundo índice. Como en mi ejemplo, todos los elementos tienen un primer índice único, por lo que obtendría esto como respuesta:
>>> max(lis)
(4, 'e')
Pero, ¿qué sucede si desea comparar cada elemento por el valor en el índice 1? Simple: uso lambda:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
Comparar elementos en un iterable que contiene objetos de diferente tipo :
Lista con elementos mixtos:
lis = ['1','100','111','2', 2, 2.57]
En Python 2 es posible comparar elementos de dos tipos diferentes :
>>> max(lis) # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x)) # compare integer version of each item
'111'
Pero en Python 3 ya no puedes hacer eso :
>>> 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()
Pero esto funciona, ya que estamos comparando la versión entera de cada objeto:
>>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)`
'111'