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?
I've found a nice workaround for this problem, which is building a frozenset containing the dictionary items:
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 likea
.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.