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)
を使用することです。ただし、辞書は常に異なるハッシュ関数を使用するため、同じ辞書の文字列は異なる場合があります。
グッドプラクティスとして知られている回避策はありますか、または辞書のようなオブジェクトを他の辞書のキーとして使用する方法を他に考えている人はいますか?
辞書項目を含む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
のような通常の辞書に完全に復元できます。
ordered dict を試すか、これらの答えを見ることができます:
pyPIにもパッケージがあります: https://pypi.python.org/pypi/frozendict
Dictをtuples(sorted(your_dict.items())
)に変換してから、ハッシュとして使用することもできます。
UPD:コメントで述べたように、OrderedDictはハッシュ化できません。私の悪いことに、それは可変なので、本当にハッシュ可能ではないはずです。