def func(p):
return p.totalScore
现在max成为:
max(players, key=func)
但是由于def语句是复合语句,它们不能用于需要表达式的地方,这就是为什么有时使用lambda的原因。
注意,lambda等同于你在一个def的return语句中。因此,不能在lambda中使用语句,只允许表达式。
max是什么?
max(a, b, c, …[, key=func]) -> value
With a single iterable argument, return its largest item. With two or
more arguments, return the largest argument.
因此,它只返回最大的对象。
**How *key* works?** 默认情况下,Python 2键基于对象的类型(例如字符串总是大于整数)基于 set of rules比较项目。要在比较之前修改对象或基于特定属性/索引进行比较,必须使用关键参数。
实施例1:
一个简单的例子,假设你有一个字符串形式的数字列表,但你想比较这些项目的整数值。
```python >>> lis = ['1','100','111','2'] ```这里max使用它们的原始值比较项目(字符串是字典比较,所以你会得到’2’作为输出):
```python >>> max(lis) '2' ```要通过它们的整数值比较项目,请使用带有简单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')
比较包含不同类型对象的iterable中的项目:
混合项目列表:
>>> lis = ['1','100','111','2', 2, 2.57]
In Python 2 it is possible to compare items of two different types:
```python >>> max(lis) # works in Python 2 '2' ``` ```python >>> max(lis, key=lambda x: int(x)) #compare integer version of each item '111' ```But in Python 3 you can’t do that any more:
>>> 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()
但这工作,因为我们比较每个对象的整数版本:
```python >>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)` >>> '111' ```敲黑板,所以,如果要返回字典中value最大的item,只需如下操作:
>>> prices = {
... 'A':123,
... 'B':450.1,
... 'C':12,
... 'E':444,
... }
>>> max(prices.items(),key=lambda x:x[1])
('B', 450.1)
>>>
- Reference: python max函数使用’key’和lambda表达式