A workaround for Python's missing frozen-dict

2020-03-01 07:01发布

In Python, when you want to use lists as keys of some dictionary, you can turn them into tuples, which are immutable and hence are hashable.

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

The same happens when you want to use set objects as keys of some dictionary - you can build a frozenset, that is again immutable and hence is hashable.

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

But it seems that for dictionary there is no equivalent.

A first idea I thought about (and found it bad finally), is to use str(some_dict) as a key. But, dictionaries always use different hash functions, so strings of equal dictionaries may be different.

Is there any workaround known as a good practice, or does anyone have other ideas how to use dictionary-like objects as keys of other dictionaries?

2条回答
祖国的老花朵
2楼-- · 2020-03-01 07:13

I've found a nice workaround for this problem, which is building a frozenset containing the dictionary items:

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

As can be seen in the code, b is a frozenset, which is immutable and hashable, and can be totally restored to be a regular dictionary like a.

查看更多
戒情不戒烟
3楼-- · 2020-03-01 07:21

You can try ordered dict or look on these answers:

and there is even a package on PyPI: https://pypi.python.org/pypi/frozendict

You can also simply convert dict to tuples(sorted(your_dict.items())) and then use as a hash.

UPD: as mentioned in comments, OrderedDict is unhashable. My bad, it is really should not be hashable since it is mutable.

查看更多
登录 后发表回答