python - Python 缺少 frozen-dict 类型的解决方法?

标签 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) 作为键。但是,字典总是使用不同的哈希函数(这会影响元素的顺序),因此相同字典的字符串可能不同。

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

最佳答案

编辑:

从 Python 3.6 开始,字典会保留插入顺序。因此,解决方法会因使用的 Python 版本而异。

对于 Python < 3.6(字典不保留插入顺序) - 使用 frozenset,这样即使顺序不同,两个集合也是相等的:

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

否则(字典保留插入顺序),使用元组。这样,可以在保留项目顺序的同时恢复字典,但是,具有不同排序的相同项目的元组将不相等。解决方法是每次在进行比较之前将元组传递给 frozenset 构造函数。

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

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

关于python - Python 缺少 frozen-dict 类型的解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39440190/

相关文章:

java - 不可变对象(immutable对象)创建

c# - 我是否需要锁定以 ReadOnlyCollection 作为参数的并发方法?

python - 格式化 numpy 浮点值

python - 如何以正确的格式在文本文件中写入两个 numpy 数组?

c++ - 模板化 map /字典实现

python - 如何更新 python 列表中的值?

swift - 初始化字典的方式之间的差异

python - 删除默认 Python 2.7 后在 CentOS 上重新安装 Python

python - Pandas - 将两个数据帧中最近的事件与条件连接起来

Scala "update"不可变对象(immutable对象)最佳实践