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

3

因此,给定一个列表:

o = [1,2,4,6]

还有一个字典:

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

什么是在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 语法。

一个更有效的方法可能是创建一个元组列表而不是一个字典。 - Matt Bryant
在你的例子中,o 的每个元素都是 f 中的一个键。这总是成立吗? - StephenTG
StephenTG:那5和3呢? - hivert
@hivert 5在f中但不在o中。我想知道o中是否有任何f没有的内容。 - StephenTG
1
@hivert,o 中永远不会有任何不在 f 中的东西。 - ModulusJoe
显示剩余2条评论
1个回答

6
你可以使用字典视图和集合操作从输入序列中仅选择键:

您可以使用字典视图与集合操作,以仅选择来自您的输入序列的键:

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

在Python 3中,你只需要使用以下内容:
min(f.keys() & o, key=f.get)

作为字典的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

如果 set_o 的大小比 f 小得多,那么这似乎不是一个很好的解决方案! - hivert
@hivert:你说得很对,我记得字典视图,在这里非常完美。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接