【问题标题】:build a dictionary for find key by value [duplicate]为按值查找键构建字典[重复]
【发布时间】:2012-09-21 09:22:30
【问题描述】:

字典通常适合按键查找值,但按键查找速度很慢

for k,v in dictionary.items():
    if v = myValue:
        return k

是否已经有一个数据结构可以同时生成 key->value 和 ke

【问题讨论】:

标签: python


【解决方案1】:

你可以试试bidict:

>>> husbands2wives = bidict({'john': 'jackie'})
>>> husbands2wives['john'] # the forward mapping is just like with dict
'jackie'
>>> husbands2wives[:'jackie'] # use slice for the inverse mapping
'john'

【讨论】:

  • 您知道这是否比仅使用倒置字典更快(正如 Martjin 建议的那样),还是只是加糖?
  • @hayden: bidict 存储正向和反向字典并提供语法糖,所以如果你创建了一次反转字典,它在速度上是一样的。
  • @MartijnPieters 这并不完全正确,正如here 所讨论的,source code 包含一些检查,使 bidict 比两个纯 dicts 稍慢。虽然对于纯读取访问,husbands2wives._fwd['john']husband2swives._bwd['jackie'] 将提供相同的速度
  • @TobiasKienzler:除非您在 150000 项目循环中运行此程序,否则差异将很小。 :-)
  • @MartijnPieters 我完全同意,读取/可维护性比那几毫秒更重要。 if 速度至关重要,请牢记这一点;在那种情况下,明确地使用逆字典可能会更好。但在 99.9% 的情况下,我会说 bidict 是最好的方法
【解决方案2】:

只需创建一个倒置映射:

from collections import defaultdict
inverted = defaultdict(list)
for k, v in dictionary.iteritems():
    inverted[v].append(k)

请注意,上面的代码处理重复值; inverted[v] 返回保存该值的键的列表

如果您的值也是唯一的,可以使用简单的 dict 代替 defaultdict

inverted = { v: k for k, v in dictionary.iteritems() }

或者,在 python 3 中,items() 是一个字典视图:

inverted = { v: k for k, v in dictionary.items() }

【讨论】:

    【解决方案3】:

    Python 3:

    revdict = {v:k for k,v in dictionary.items()}
    

    (Python 2 使用 .iteritems() 代替)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-06
      • 2013-01-02
      • 2010-11-19
      • 2011-12-06
      相关资源
      最近更新 更多