lambda
является анонимной функцией, это эквивалентно:
def func(p):
return p.totalScore
Теперь max
становится:
max(players, key=func)
Но поскольку def
операторы являются составными, их нельзя использовать там, где требуется выражение, поэтому иногда lambda
они используются.
Обратите внимание, что lambda
это эквивалентно тому, что вы бы указали в операторе возврата def
. Таким образом, вы не можете использовать операторы внутри lambda
, допускаются только выражения.
Что делает max
?
max (a, b, c, ... [, key = func]) -> значение
С одним итеративным аргументом верните его самый большой элемент. С двумя или более аргументами верните самый большой аргумент.
Таким образом, он просто возвращает объект, который является самым большим.
Как key
работает?
По умолчанию в Python 2 key
сравниваются элементы на основе набора правил, основанных на типе объектов (например, строка всегда больше целого числа).
Чтобы изменить объект перед сравнением или сравнить на основе определенного атрибута / индекса, вы должны использовать key
аргумент.
Пример 1:
Простой пример. Предположим, у вас есть список чисел в строковой форме, но вы хотите сравнить эти элементы по их целочисленным значениям.
>>> lis = ['1', '100', '111', '2']
Здесь max
сравниваются элементы, используя их исходные значения (строки сравниваются лексикографически, так что вы получите '2'
результат):
>>> max(lis)
'2'
Для сравнения элементов по их целочисленному значению используйте key
простое lambda
:
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
Пример 2. Применение max
к списку кортежей.
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
По умолчанию max
будут сравниваться элементы по первому индексу. Если первый индекс совпадает, тогда он будет сравнивать второй индекс. Как и в моем примере, все элементы имеют уникальный первый индекс, поэтому вы получите ответ:
>>> max(lis)
(4, 'e')
Но что, если вы хотите сравнить каждый элемент по значению с индексом 1? Просто: используйте lambda
:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
Сравнение элементов в итерируемом объекте, который содержит объекты различного типа :
Список со смешанными предметами:
lis = ['1','100','111','2', 2, 2.57]
В Python 2 можно сравнивать элементы двух разных типов :
>>> max(lis) # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x)) # compare integer version of each item
'111'
Но в Python 3 вы больше не можете этого делать :
>>> 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()
Но это работает, так как мы сравниваем целочисленную версию каждого объекта:
>>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)`
'111'