Fork me on GitHub

【转】Python中max(),min() 的key操作

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)
>>> 
posted @ 2018-05-12 12:52  Byron_NG  阅读(10168)  评论(0编辑  收藏  举报