Python min/max 的关键字函数

Keyword functions for Python min/max

我正在尝试了解其工作原理:

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

产生

b

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

min(iterable[, key]) Return the smallest item in an iterable or the smallest of two or more arguments... The optional key argument specifies a one-argument ordering function like that used for list.sort(). The key argument, if supplied, must be in keyword form (for example, min(a,b,c,key=func)).

在哪里可以找到有关可用功能的更多信息?如果是字典,是不是都是字典方法?

编辑:我今天遇到这个:

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

仍在寻找有关 min/max

的可用关键字函数的信息

假设您的对象具有您想要用来获取最小值的某些属性:

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

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


例如 sorted() 中存在同样的事情,因此您可以轻松地按从对象派生的值进行排序。假设您有一个人员列表,想要按名字排序,然后是姓氏:

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

你写的代码是

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

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

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

With a single iterable argument, return its lowest item. With two or more arguments, return the lowest argument.

这里的key是用来传递自定义比较函数的。

示例:按列表长度输出最大值,其中 arg1、arg2 均为列表。

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

但是如果我想要列表中的最大值,但要考虑元组的第二个元素怎么办?这里我们可以使用函数,官方给的documentationdef 语句是复合语句,不能在需要表达式的地方使用,这就是为什么有时会使用 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)

所以函数基本上取决于可迭代对象和传递比较标准。

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

The method get() returns a value for the given key. If key is not available then returns default value None.

如这里一样,get 方法中没有参数,它只是迭代字典的值。因此 min 为您提供具有最小值的密钥。

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

enumerate(thing), where thing is either an iterator or a sequence, returns a iterator that will return (0, thing[0]), (1, thing1), (2, thing[2])

现在我们已经使用了operator模块的itemgetter功能。 operator.itemgetter(n) 构造一个可调用对象,假定可迭代对象(例如列表、元组、集合)作为输入,并从中获取第 n 个元素。

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

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

所以key中的功能范围差不多就够用了。我们可以使用很多功能,但唯一的动机是,它是比较的标准。