Python 为按值查找键构建字典

Python 为按值查找键构建字典,python,Python,字典通常适合按键查找值,但按值查找键的速度非常慢 for k,v in dictionary.items(): if v = myValue: return k 是否已经有了一个数据结构,使得key->value和ke都可以使用,您可以尝试: 只需创建一个反向映射: from collections import defaultdict inverted = defaultdict(list) for k, v in dictionary.iteritems():

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

for k,v in dictionary.items():
    if v = myValue:
        return k
是否已经有了一个数据结构,使得key->value和ke都可以使用,您可以尝试:


只需创建一个反向映射:

from collections import defaultdict
inverted = defaultdict(list)
for k, v in dictionary.iteritems():
    inverted[v].append(k)
注意,上面的代码处理重复的值
inversed[v]
返回保存该值的键列表

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

inverted = { v: k for k, v in dictionary.iteritems() }
或者,在python 3中,
items()
是字典视图:

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

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

(Python 2改用
.iteritems()

你知道这是不是比仅仅使用倒装的dict(如Martjin所建议的)更快,还是只是为了同样的目的而加糖?@hayden:bidict存储前向和倒装的dict并提供语法糖,因此,在速度方面,如果您创建了一次反向dict,情况也是一样的。@MartijnPieters这并不完全正确,正如前面所讨论的,它包含一些检查,使得bidict比两个纯dict稍微慢一点。虽然是纯读访问,
husband2fixes.\u fwd['john']
husband2fixes.\u bwd['jackie']
将提供相同的功能speed@TobiasKienzler:除非在150000项循环中运行此项,否则差异将是最小的。:-)@我完全同意MartijnPieters的观点,读/可维护性比这几毫秒更重要。如果速度是至关重要的,那就要记住这一点;在这种情况下,明确使用反向字典可能会更好。但在99.9%的情况下,我会说bidict是我反对的最好的方法,因为这是一个复制品——这是一个特殊情况,其中键和值从来都不相同,至少从其公认的答案来看是如此。在一般情况下,这个问题比另一个问题好得多。由于后者的限制,这个问题更像是另一个问题的重复。因此讨论:
revdict = {v:k for k,v in dictionary.items()}