在 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
这样的常规字典。