我试图了解这是如何工作的:
my_dict = {'a':2,'b':1}
min(my_dict, key=my_dict.get)
Run Code Online (Sandbox Code Playgroud)
产生
b
Run Code Online (Sandbox Code Playgroud)
这是一个非常酷的功能,我想要更好地理解.
根据文档
min(iterable [,key])返回可迭代中的最小项或两个或多个参数中的最小值...可选的key参数指定一个单参数排序函数,类似于list.sort().键参数(如果提供)必须采用关键字形式(例如,min(a,b,c,key = func)).
我在哪里可以找到有关可用功能的更多信息?在字典的情况下,是否所有字典方法?
编辑:我今天遇到过这个:
max(enumerate(array_x), key=operator.itemgetter(1))
Run Code Online (Sandbox Code Playgroud)
仍在寻找有关min/max的可用关键字函数的信息
你写的代码是
my_dict = {'a':2,'b':1}
min(my_dict, key=my_dict.get)
Run Code Online (Sandbox Code Playgroud)
实际上这适用于min功能.那么,min做什么?
min(a, b, c, ...[, key=func]) -> value
Run Code Online (Sandbox Code Playgroud)
使用单个可迭代参数,返回其最低项.使用两个或多个参数,返回最低参数.
此处的键用于传递自定义比较功能.
示例:输出max by list的长度,其中arg1,arg2都是列表.
>>>> max([1,2,3,4], [3,4,5], key=len)
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
但是如果我想从列表中获取最大值,但是考虑元组的第二个元素呢?在这里我们可以使用官方文档中给出的函数.这些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)
Run Code Online (Sandbox Code Playgroud)
所以函数基本上取决于iterable并传递比较标准.
现在在您的示例中,您正在迭代字典.而在关键的,您使用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])
现在我们使用itemgetter了运算符模块的功能.operator.itemgetter(n)构造一个可调用的函数,它将一个可迭代对象(例如list,tuple,set)作为输入,并从中取出第n个元素.
你也可以使用这里的lambda函数
max(enumerate(array_x), key=lambda i: i[1])
Run Code Online (Sandbox Code Playgroud)
所以功能范围key几乎可以使用.我们可以使用许多功能,但唯一的动机是,它是比较的标准.