如何找到钥匙在列表中的最低值的字典钥匙

问题描述:

我试图在钥匙位于单独列表中的字典中获取钥匙的最低值。我还担心,以我的方式初始化我的变量“键”可能会在将来造成麻烦,尽管我认为它不会。如何找到钥匙在列表中的最低值的字典钥匙

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 

结束了一个无效的语法错误。

使用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