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]
但是如果我想要列表中的最大值,但要考虑元组的第二个元素怎么办?这里我们可以使用函数,官方给的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)
所以函数基本上取决于可迭代对象和传递比较标准。
现在在您的示例中,您正在迭代字典。在 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
中的功能范围差不多就够用了。我们可以使用很多功能,但唯一的动机是,它是比较的标准。
我正在尝试了解其工作原理:
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]
但是如果我想要列表中的最大值,但要考虑元组的第二个元素怎么办?这里我们可以使用函数,官方给的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)
所以函数基本上取决于可迭代对象和传递比较标准。
现在在您的示例中,您正在迭代字典。在 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
中的功能范围差不多就够用了。我们可以使用很多功能,但唯一的动机是,它是比较的标准。