如果您需要使用从
key1
到
keyn
的整个组合来获取
value
,您可以像我下面建议的那样翻转字典,其复杂度为O(nk*nv)(键的数量*值的数量),或者使用上面的
tuple
方法。
假设您需要在插入时构建
tuple
,并且在需要获取值时再次构建,这两种方法都将是O(nk),其中
nk
是键的数量。
如果嵌套得比较深(有很多值共享部分有序键列表),嵌套的
dict
版本可能更节省空间,并且获取值仍然是O(nk),但可能比元组版本慢。
然而,插入速度会更慢,虽然我无法量化其速度。您将不得不为每个插入构造
至少一个层的
dict
,并测试先前级别的
dict
的存在性。
有许多递归defaultdict
的配方可以从编码角度简化插入,但实际上并不能加快速度。
tuple
方法在插入时更简单、更快,但根据嵌套情况可能需要更多内存。
在我了解要求之前的原始答案:
为什么不呢?
{'key1' : 'value', 'key2' : 'value', .... 'keyn' : 'value' }
它只是在每个位置存储对value的引用,而不是value本身,因此内存使用量会比嵌套的dict版本少,并且除非有大量的value,否则不会比tuple版本大多少。
关于Python标准类型操作的时间复杂度,请参见
Python维基。
基本上,插入或获取一个项目的平均时间复杂度为O(1)。
平均而言,获取值的所有键将是O(n):
[key for key in mydict if mydict[key] == value]
然而,如果添加键或搜索所有键是常规操作,则您的
dict
是错误的。您需要:
{'value': [key1, key2, ... keyn]}
这样,你只需要使用
mydict[value].append(newkey)
来添加键值,使用
mydict[value]
来获取所有键值,而且它们的平均时间复杂度都是O(1)。
tuple
几乎肯定更好。 - agf