【问题标题】:Most efficient way to find the key of the smallest value in a dictionary from a subset of the dictionary从字典的子集中查找字典中最小值的键的最有效方法
【发布时间】:2014-03-02 07:37:53
【问题描述】:

所以给出一个列表:

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 语法。

【问题讨论】:

  • 一种更有效的方法可能是创建元组列表而不是字典。
  • 在您的示例中,o 的每个元素都是 f 中的一个键。总是这样吗?
  • StephenTG:5 和 3 怎么样?
  • @hivert 5 在 f 中,但不在 o 中。我在问 o 中是否有任何东西不在 f 中。
  • @hivert o 中永远不会有任何不在 f 中的东西。

标签: python dictionary min


【解决方案1】:

您可以使用 dictionary view 和 set 操作从输入序列中仅选择键:

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

【讨论】:

  • 如果set_o的大小远小于f的大小,这看起来不是一个很好的解决方案!
  • @hivert:你说的很对,我记得 dict 视图,这里很完美。
猜你喜欢
  • 1970-01-01
  • 2015-01-16
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 2019-12-28
  • 2016-02-11
相关资源
最近更新 更多