Python min / max

时间:2016-04-08 14:41:09

标签: python key min

我想了解这是如何运作的:

my_dict = {'a':2,'b':1}
min(my_dict, key=my_dict.get)

产生

b

这是一个非常酷的功能,我想更好地理解 基于documentation

  

min(iterable [,key])   返回可迭代中的最小项或两个或多个参数中最小的...   可选的key参数指定一个单参数排序函数,就像用于list.sort()的函数一样。键参数(如果提供)必须采用关键字形式(例如,min(a,b,c,key = func))。

在哪里可以找到有关可用功能的更多信息?在字典的情况下,它是所有的字典方法吗?

编辑:我今天遇到了这个:

max(enumerate(array_x), key=operator.itemgetter(1))

仍在寻找有关min / max

的可用关键字函数的信息

2 个答案:

答案 0 :(得分:5)

您编写的代码是

my_dict = {'a':2,'b':1}
min(my_dict, key=my_dict.get)

实际上这适用于min函数。 那么,min会做什么?

min(a, b, c, ...[, key=func]) -> value
  

使用单个可迭代参数,返回其最低项。如果有两个或多个参数,则返回最低参数。

此处的密钥用于传递自定义比较功能。

示例:输出max by list的长度,其中arg1,arg2都是列表。

>>>> max([1,2,3,4], [3,4,5], key=len)
[1, 2, 3, 4]

但是,如果我想从列表中获取最大值,但是考虑元组的第二个元素呢?在这里我们可以使用官方documentation中给出的函数。 def语句是复合语句,在需要表达式时不能使用,这就是为什么有时使用 lambda 的。

请注意,lambda等同于你在def的return语句中放置的内容。因此,您不能在lambda中使用语句,只允许表达式。

>>> max(l, key = lambda i : i[1])
(1, 9)

# Or

>>> import operator
>>> max(l, key = operator.itemgetter(1))
(1, 9)

因此函数基本上取决于iterable并传递比较标准。

现在在您的示例中,您正在迭代字典。在 key 中,您在此处使用get方法。

  

方法get()返回给定键的值。如果key不可用,则返回默认值None。

在这里,get方法中没有任何参数可以简单地迭代字典的值。因此min为您提供了具有最小值的密钥。

max(enumerate(array_x), key=operator.itemgetter(1)) 我们想比较数组的值而不是它们的索引。所以我们列举了数组。

  

枚举(thing),其中thing是迭代器或序列,返回将返回的迭代器(0,thing [0]),(1,thing 1),(2,thing [2 ])

现在我们使用了 operator 模块的itemgetter功能。 operator.itemgetter(n)构造一个可调用的函数,它将一个可迭代对象(例如list,tuple,set)作为输入,并从中获取第n个元素。

你也可以使用像这里的lambda函数

max(enumerate(array_x), key=lambda i: i[1])

因此key中的函数范围几乎可以使用。我们可以使用许多功能,但唯一的动机是,这是比较的标准。

答案 1 :(得分:1)

想象一下,您有一些对象需要使用某些属性来获得最小值:

min(my_objects, key=lambda x: x.something)

这将为您提供具有最小something属性的对象。

例如sorted()中存在同样的事情,因此您可以根据从对象派生的值轻松排序。想象一下,你有一个人的列表,并希望按名字排序,然后姓:

people.sort(key=lambda x: (x.first_name, x.last_name))