2016-04-08 58 views
2

我试图理解它是如何工作的:关键字功能/最大

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

产生

b 

这是一个很酷的功能和一个我想更好地了解。基于该documentation

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

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

编辑:我这今天碰上了:

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

仍在寻找最小/最大可用的关键字功能的信息

回答

1

假设你有对象的一些属性要使用获得的最小值:

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

这会给你带有最小something属性的对象。


同样的事情存在,例如在sorted()让您轻松排序从对象得到的值。想象一下,你有一个人名单,并希望通过第一名称进行排序,然后姓氏:

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

据我所知,我的问题与lambda函数没有直接关系(尽管我明白lambda可以用作关键字函数)。 – DanGoodrick

3

你写的代码是

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

其实这个工作在min功能。 那么,min做什么?

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

有了一个迭代参数,返回它的最低项目。使用两个或更多个参数,返回最低的参数。

这里的关键是用来传递一个自定义的比较函数。

示例:输出最大长度列表,其中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) 

所以函数基本上依赖于可迭代和通过比较的标准。

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

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

由于在这里,没有参数在get方法,它只是迭代字典的值。因此,min为您提供最低价值的关键。

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

枚举(事),其中一点是任一个迭代或序列,返回一个迭代器将返回(0,东西[0]),(1,一点1),(2,事[2] )

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

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

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

所以的功能key范围几乎达到使用。我们可以使用许多功能,但唯一的动机是,这是比较的标准。

+0

希望这可以帮助@ThiefMaster。 – 7bStan