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'