lambda
é uma função anônima, é equivalente a:
def func(p):
return p.totalScore
Agora max
se torna:
max(players, key=func)
Porém, como def
declarações são declarações compostas, elas não podem ser usadas onde uma expressão é necessária, é por isso que às vezes lambda
são usadas.
Observe que isso lambda
é equivalente ao que você colocaria em uma declaração de retorno de a def
. Portanto, você não pode usar instruções dentro de a lambda
, apenas expressões são permitidas.
O que max
faz?
max (a, b, c, ... [, key = func]) -> valor
Com um único argumento iterável, retorne seu maior item. Com dois ou mais argumentos, retorne o maior argumento.
Portanto, ele simplesmente retorna o objeto que é o maior.
Como key
funciona?
Por padrão, no Python 2 key
compara itens com base em um conjunto de regras com base no tipo de objetos (por exemplo, uma string é sempre maior que um número inteiro).
Para modificar o objeto antes da comparação ou para comparar com base em um atributo / índice específico, use o key
argumento
Exemplo 1:
Um exemplo simples, suponha que você tenha uma lista de números em forma de sequência, mas deseja comparar esses itens pelo valor inteiro.
>>> lis = ['1', '100', '111', '2']
Aqui, max
os itens são comparados usando seus valores originais (as strings são comparadas lexicograficamente para que você obtenha '2'
como saída):
>>> max(lis)
'2'
Para comparar os itens pelo valor inteiro, use key
um simples lambda
:
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
Exemplo 2: Aplicando max
a uma lista de tuplas.
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
Por padrão max
, os itens serão comparados pelo primeiro índice. Se o primeiro índice for o mesmo, ele comparará o segundo índice. Como no meu exemplo, todos os itens têm um primeiro índice exclusivo, então você recebe isso como resposta:
>>> max(lis)
(4, 'e')
Mas e se você quiser comparar cada item pelo valor no índice 1? Simples: use lambda
:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
Comparando itens em um iterável que contém objetos de tipos diferentes :
Lista com itens mistos:
lis = ['1','100','111','2', 2, 2.57]
No Python 2, é possível comparar itens de dois tipos diferentes :
>>> max(lis) # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x)) # compare integer version of each item
'111'
Mas no Python 3 você não pode mais fazer isso :
>>> 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()
Mas isso funciona, pois estamos comparando a versão inteira de cada objeto:
>>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)`
'111'