Python 有没有更好的方法来存储双向词典,而不是将其反向分开存储?

Python 有没有更好的方法来存储双向词典,而不是将其反向分开存储?,python,dictionary,Python,Dictionary,给定生成的一对一字典(=双射) for key, value in someGenerator: myDict[key] = value 通过添加 invDict[value] = key 转到for循环。但这是一种蟒蛇式的方式吗?我是否应该编写一个类双射(dict),另外管理这个反向字典并提供第二个查找功能?或者这样的结构(或类似的结构)已经存在了吗?我过去所做的是创建一个reversedict函数,它将接受一个dict并返回相反的映射,如果我知道它是一对一的,则返回值到

给定生成的一对一字典(=双射)

for key, value in someGenerator:
     myDict[key] = value
通过添加

    invDict[value] = key

转到
for
循环。但这是一种蟒蛇式的方式吗?我是否应该编写一个
类双射(dict)
,另外管理这个反向字典并提供第二个查找功能?或者这样的结构(或类似的结构)已经存在了吗?

我过去所做的是创建一个
reversedict
函数,它将接受一个dict并返回相反的映射,如果我知道它是一对一的,则返回值到键(如果两次看到相同的值,则抛出异常),如果不是,则返回值到键列表。这样一来,每次我想要反向查找时,就不必同时构造两个dict,我可以像平常一样创建dict,并在最后调用generic
reversedict
函数

然而,Jon在评论中提到的解决方案似乎是更好的。(我的
reversedict
函数似乎是他的bidict的
~
操作符)

如果需要O(log(n))时间来访问值,则需要映射的表示形式和反向映射的表示形式

否则,最好是一个方向上的O(log(n))和另一个方向上的O(n)


编辑:不是O(log(n)),谢谢Claudiu,但是您仍然需要两个数据结构来实现快速访问时间。这将或多或少与dict和inverse dict的空间相同。

从外观上看,这是怎么回事,
bidict
只是用正向和反向映射包装了两个单独的Python字典,所以它的效率并不比你自己做同样的事情高。事实上,如果你做了大量的键查找,由于函数调用开销,它会慢得多。这几乎不是一个答案,我也没有实际使用它来个人推荐它的经验。不过要注意的是,如果我没记错的话,在使用切片表示法时,关于该库的API是否是python的,存在着一些相当激烈的争论。但是,情人眼里出西施,诸如此类。@TobiasKienzler确实如此。try/except块也会减慢速度。在实践中,我发现
returnd[k]if k In d else something\u else
比两者都要快得多
try:return d[k]\n除了KeyError:return something\u else
return d.get(k,something\u else)
,即两个键查找比允许Python生成异常和/或调用实例方法更快。就我个人而言,我认为它没有提供足够的附加功能(与仅使用两个DICT相比)来保证其性能问题,但如果这不是问题,那么它至少具有易于使用的优点。@TobiasKienzler最近,我不得不优化一个相当复杂的递归函数,该函数被调用了150000次,因此,我花了相当长的时间使用
cProfile
分析不同的方法,并通过使用
d[k]if k in d
方法节省了大量CPU时间。后来我将其更改为使用
d=collections.defaultdict(lambda:None);v=d[k];如果v不是其他v,则返回其他值,这更好,因为它只需要一次键查找,键丢失只会发生一次,而
defaultdict
是用C实现的。你对
namedbidit
的看法是对的-我第一次误读了它。bidict非常适合我的目的-它基本上在里面存储了反向字典,但通过使用切片操作符提高了访问能力。cts没有O(log(n))查找,它们已经摊销了O(1)查找…是的,应该在我发布之前查一下:)