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

Mod*_*Joe 2 python dictionary min

因此给出一个列表:

o = [1,2,4,6]
Run Code Online (Sandbox Code Playgroud)

和字典:

f = {1:10, 2:5, 3:1, 4:3, 5:7, 6:9}
Run Code Online (Sandbox Code Playgroud)

查找与f中的最小值(其中键也是列表o的成员)相关联的f中的键的最有效方法是什么?

使用上面的列表(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)
Run Code Online (Sandbox Code Playgroud)

确实可以,但是创建新字典似乎效率很低。

因此在这里使用python 2.6,因此字典字典的dict语法也是如此。

Mar*_*ers 5

您可以使用带有设置操作的字典视图从输入序列中仅选择键:

min(f.viewkeys() & o, key=f.get)
Run Code Online (Sandbox Code Playgroud)

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

min(f.keys() & o, key=f.get)
Run Code Online (Sandbox Code Playgroud)

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

另外,您可以使用一个按键功能,该功能排除您不想包含的按键:

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

我在这里使用一个集合来提高成员资格测试的效率。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
Run Code Online (Sandbox Code Playgroud)