lambda
es una función anónima, es equivalente a:
def func(p):
return p.totalScore
Ahora se max
convierte en:
max(players, key=func)
Pero como las def
declaraciones son declaraciones compuestas, no se pueden usar donde se requiere una expresión, por eso a veces lambda
se usan las.
Tenga en cuenta que lambda
es 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é max
hacer?
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 key
funciona
De manera predeterminada, en Python 2 key
compara 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 key
argumento.
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 max
comparan 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 key
uno simple lambda
:
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
Ejemplo 2: Aplicar max
a una lista de tuplas.
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
Por defecto max
comparará 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'