如何找到钥匙在列表中的最低值的字典钥匙
问题描述:
我试图在钥匙位于单独列表中的字典中获取钥匙的最低值。我还担心,以我的方式初始化我的变量“键”可能会在将来造成麻烦,尽管我认为它不会。如何找到钥匙在列表中的最低值的字典钥匙
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
中不存在。
您可以使用'min(l,key = d.get)'来避免lambda。 – Volatility 2013-05-10 08:52:04
@Volatility:甚至可能会引发'KeyError's。 – 2013-05-10 08:52:54
无论如何''None'在列表中'min'会引发'TypeError:unorderable types',所以它并不重要(它确实使调试更难) – Volatility 2013-05-10 08:55:53