Python缺少冻结dict类型的解决方案?

2024-04-29 15:26:50 发布

您现在位置:Python中文网/ 问答频道 /正文

在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)作为键。但是,字典总是使用不同的散列函数,所以相同字典的字符串可能不同。

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


Tags: 对象列表字典value情况somedictlist
2条回答

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

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

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

UPD:正如评论中提到的,OrderedDict是不可更改的。糟糕的是,它真的不应该是散列的,因为它是可变的。

我找到了解决这个问题的一个很好的方法,就是构建一个包含字典项的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是一个frozenset,它是不可变的和散列的,并且可以完全恢复为像a这样的常规字典。

相关问题 更多 >