关于字典:Python缺少冻结字典类型的解决方法?

A workaround for Python's missing frozen-dict type?

本问题已经有最佳答案,请猛点这里访问。

在Python中,当您想使用列表作为某些字典的键时,可以将它们转换为元组,这些元组是不可变的,因此是可哈希的。

1
2
3
>>> a = {}
>>> a[tuple(list_1)] = some_value
>>> a[tuple(list_2)] = some_other_value

当您想使用set对象作为某个字典的键时,也会发生同样的情况——您可以构建一个frozenset,它同样是不可变的,因此是可哈希的。

1
2
3
>>> a = {}
>>> a[frozenset(set_1)] = some_value
>>> a[frozenset(set_2)] = some_other_value

但似乎字典里没有对等的词。

我想到的第一个想法(最后发现很糟糕)是用str(some_dict)作为一把钥匙。但是,字典总是使用不同的哈希函数,因此相同字典的字符串可能不同。

有没有被称为"良好实践"的变通方法,或者有没有人对如何使用类似字典的对象作为其他字典的键有其他想法?


我为这个问题找到了一个很好的解决方法,那就是构建一个包含字典项的冻结集:

1
2
3
4
5
>>> a = {'key1' : 'val1', 'key2' : 'val2'}
>>> b = frozenset(a.items())
>>> frozenset_restored_to_dict = dict(b)
>>> frozenset_restored_to_dict
{'key2': 'val2', 'key1': 'val1'}

从代码中可以看出,b是一个frozenset,它是不可变的,可以散列的,并且可以完全恢复为像a这样的常规字典。


您可以尝试按顺序听写或查看以下答案:

  • "冷冻口述"是什么?
  • 不可变字典,仅用作其他字典的键
  • 如何在python中创建不可变字典?

Pypi上甚至还有一个包:https://pypi.python.org/pypi/frozendict

您还可以简单地将dict转换为元组(sorted(your_dict.items())),然后用作哈希。

更新:正如评论中提到的,ordereddict是不可显示的。我的错,它真的不应该是散列的,因为它是可变的。