在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)
作为关键。但是,字典总是使用不同的散列函数,因此相同字典的字符串可能不同。
是否有任何解决方法称为良好做法,或者是否有人有其他想法如何使用类字典对象作为其他词典的键?
答案 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是不可取的。我的坏,它真的不应该是可以清洗的,因为它是可变的。