从字典的子集中查找字典中最小值的键的最有效方法

时间:2014-02-05 17:46:46

标签: python dictionary min

所以给出一个清单:

o = [1,2,4,6]

还有一本字典:

f = {1:10, 2:5, 3:1, 4:3, 5:7, 6:9}

在f中找到与f中最低值相关联的密钥的最有效方法是什么,其中密钥也是列表的成员o?

使用上面的列表(o)和字典(f),我将寻找键4,而键3与值1和更低,3不是列表o的成员。

目前我正在创建一个要检查的密钥对子集的字典,然后使用min来获取值:

f_temp = dict((x,f[x]) for x in o)
current = min(f_temp, key=f_temp.get)

这确实有效,但创建一个新字典似乎效率低下。

在这里使用python 2.6,因此使用字典理解的dict语法。

1 个答案:

答案 0 :(得分:5)

您可以使用dictionary view进行设置操作,仅从输入序列中选择键:

min(f.viewkeys() & o, key=f.get)

在Python 3中,您需要使用的是:

min(f.keys() & o, key=f.get)

因为dict.keys()方法现在返回字典视图。

或者,您可以使用排除您不想包含的键的键功能:

set_o = set(o)
min(f, key=lambda k: f[k] if k in set_o else float('inf'))

我在这里使用一组来提高会员资格的效率。 float('inf')(正无穷大)保证始终测试大于任何其他值。

演示:

>>> o = [1, 2, 4, 6]
>>> f = {1: 10, 2: 5, 3: 1, 4: 3, 5: 7, 6: 9}
>>> min(f.viewkeys() & o, key=f.get)
4
>>> set_o = set(o)
>>> min(f, key=lambda k: f[k] if k in set_o else float('inf'))
4