web-dev-qa-db-ja.com

Pythonの行方不明のdict型の回避策はありますか?

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)を使用することです。ただし、辞書は常に異なるハッシュ関数を使用するため、同じ辞書の文字列は異なる場合があります。

グッドプラクティスとして知られている回避策はありますか、または辞書のようなオブジェクトを他の辞書のキーとして使用する方法を他に考えている人はいますか?

11

辞書項目を含む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のような通常の辞書に完全に復元できます。

19

ordered dict を試すか、これらの答えを見ることができます:

pyPIにもパッケージがあります: https://pypi.python.org/pypi/frozendict

Dictをtuples(sorted(your_dict.items()))に変換してから、ハッシュとして使用することもできます。

UPD:コメントで述べたように、OrderedDictはハッシュ化できません。私の悪いことに、それは可変なので、本当にハッシュ可能ではないはずです。

4
Andrey Rusanov