lambda
是一个匿名函数,它等价于:
def func(p):
return p.totalScore
现在max
变成:
max(players, key=func)
但是由于def
语句是复合语句,它们不能用于需要表达式的地方,这就是有时lambda
使用 's 的原因。
请注意,这lambda
相当于您在 a 的 return 语句中放入的内容def
。因此,您不能在 a 中使用语句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'