2016-04-08 60 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