2013-05-10 126 views
2

我試圖在鑰匙位於單獨列表中的字典中獲取鑰匙的最低值。我還擔心,以我的方式初始化我的變量「鍵」可能會在將來造成麻煩,儘管我認爲它不會。如何找到鑰匙在列表中的最低值的字典鑰匙

d = { "a":3, "b":2, "c":7 } 
l = ["a","b"] 

key = l[0] 
for c in l: 
    key = c if d[c] < d[key] else key 
print key 

我仍然試圖得到列表理解的句柄。我已經試過這樣的事情來代替for循環和一切,但沒有奏效:

key = c if d[c] < d[key] else key for c in l 

結束了一個無效的語法錯誤。

回答

8

使用key參數爲min() function挑選出一個最關鍵的:

min(l, key=d.__getitem__) 

key參數必須是一個可調用的,在輸入列表中的地圖項的值由要挑最小項目。在你的例子中,'b'是最低的項目,因爲d將其映射到2,而'a'映射到3

演示:

>>> d = { "a":3, "b":2, "c":7 } 
>>> l = ["a","b"] 
>>> min(l, key=d.__getitem__) 
'b' 

如果是在l任何價值d上市d.__getitem__將引發一個KeyError

>>> min(['a', 'b', 'e'], key=d.__getitem__) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'e' 

你也可以使用lambda i: d[i]得到同樣的效果沒有可怕的直接使用dunder(雙下劃線)的特殊方法。

如果你想忽略不存在的鍵,使用方法:

min(['a', 'b', 'e'], key=lambda i: d.get(i, float('inf')) 

float('inf')是保證總是比任何其他數量較大,所以在上面的例子中'e'將不被認爲是最小的,因爲它在d中不存在。

+1

您可以使用'min(l,key = d.get)'來避免lambda。 – Volatility 2013-05-10 08:52:04

+2

@Volatility:甚至可能會引發'KeyError's。 – 2013-05-10 08:52:54

+0

無論如何''None'在列表中'min'會引發'TypeError:unorderable types',所以它並不重要(它確實使調試更難) – Volatility 2013-05-10 08:55:53