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

时间:2016-09-11 20:10:17

标签: python dictionary immutability

在Python中,当你想使用列表作为某些字典的键时,你可以把它们变成元组,这些元组是不可变的,因此是可以编辑的。

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

当你想使用 set 对象作为某些字典的键时,也会发生同样的情况 - 你可以构建一个 frozenset ,这也是不可变的,因此是可以删除的。

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

但似乎字典没有等价物。

我想到的第一个想法(最终发现它很糟糕)是使用str(some_dict)作为关键。但是,字典总是使用不同的散列函数,因此相同字典的字符串可能不同。

是否有任何解决方法称为良好做法,或者是否有人有其他想法如何使用类字典对象作为其他词典的键?

2 个答案:

答案 0 :(得分:12)

我找到了解决此问题的一个很好的解决方法,即构建包含字典项的 frozenset

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

从代码中可以看出,b是一个冻结集,它是不可变和可散列的,可以完全恢复为a之类的常规字典。

答案 1 :(得分:3)

您可以尝试ordered dict或查看以下答案:

甚至还有一个关于PyPI的包:https://pypi.python.org/pypi/frozendict

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

UPD:正如评论中所提到的,OrderedDict是不可取的。我的坏,它真的不应该是可以清洗的,因为它是可变的。