lambda
là một hàm ẩn danh, nó tương đương với:
def func(p):
return p.totalScore
Bây giờ max
trở thành:
max(players, key=func)
Nhưng vì các def
câu lệnh là các câu lệnh ghép, chúng không thể được sử dụng khi cần một biểu thức, đó là lý do tại sao đôi khi lambda
chúng được sử dụng.
Lưu ý rằng lambda
tương đương với những gì bạn đưa vào một tuyên bố trả về của a def
. Vì vậy, bạn không thể sử dụng các câu lệnh bên trong a lambda
, chỉ các biểu thức được cho phép.
Không gì max
làm gì?
tối đa (a, b, c, ... [, key = func]) -> giá trị
Với một đối số lặp duy nhất, trả về mục lớn nhất của nó. Với hai hoặc nhiều đối số, trả về đối số lớn nhất.
Vì vậy, nó chỉ đơn giản trả về đối tượng là lớn nhất.
Làm thế nào để key
làm việc?
Theo mặc định trong Python 2 key
so sánh các mục dựa trên một bộ quy tắc dựa trên loại đối tượng (ví dụ: một chuỗi luôn lớn hơn một số nguyên).
Để sửa đổi đối tượng trước khi so sánh hoặc so sánh dựa trên một thuộc tính / chỉ mục cụ thể, bạn phải sử dụng key
đối số.
Ví dụ 1:
Một ví dụ đơn giản, giả sử bạn có một danh sách các số ở dạng chuỗi, nhưng bạn muốn so sánh các mục đó theo giá trị nguyên của chúng.
>>> lis = ['1', '100', '111', '2']
Ở đây max
so sánh các mục sử dụng các giá trị ban đầu của chúng (các chuỗi được so sánh theo từ vựng để bạn nhận '2'
làm đầu ra):
>>> max(lis)
'2'
Để so sánh các mục theo giá trị số nguyên của chúng, hãy sử dụng key
một cách đơn giản lambda
:
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
Ví dụ 2: Áp dụng max
vào danh sách các bộ dữ liệu.
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
Theo mặc định max
sẽ so sánh các mục theo chỉ mục đầu tiên. Nếu chỉ mục đầu tiên giống nhau thì nó sẽ so sánh chỉ mục thứ hai. Như trong ví dụ của tôi, tất cả các mục có một chỉ mục đầu tiên duy nhất, vì vậy bạn sẽ nhận được đây là câu trả lời:
>>> max(lis)
(4, 'e')
Nhưng, nếu bạn muốn so sánh từng mục theo giá trị tại chỉ mục 1 thì sao? Đơn giản: sử dụng lambda
:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
So sánh các mục trong một lần lặp có chứa các đối tượng thuộc loại khác nhau :
Danh sách với các mặt hàng hỗn hợp:
lis = ['1','100','111','2', 2, 2.57]
Trong Python 2 có thể so sánh các mục của hai loại khác nhau :
>>> max(lis) # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x)) # compare integer version of each item
'111'
Nhưng trong Python 3, bạn không thể làm điều đó nữa :
>>> 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()
Nhưng điều này hoạt động, vì chúng ta đang so sánh phiên bản số nguyên của từng đối tượng:
>>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)`
'111'