2016-09-11 14 views
1

Pythonでは、ある辞書のキーとしてリストを使いたいときには、そのリストを不変でありハッシュ可能なタプルにすることができます。Pythonのfree-dictタイプの回避策?

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

あなたがを使用したい場合、同じ問題が発生したが、いくつかの辞書のキーとしてオブジェクトを設定する - あなたは再び不変であり、したがってハッシュ可能ですのfrozensetを構築することができます。

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

しかし、辞書には同等のものはないようです。

私が考えた(そして最終的には悪いと思った)最初の考えは、str(some_dict)をキーとして使用することです。ただし、辞書は常に異なるハッシュ関数を使用するため、同じ辞書の文字列は異なる場合があります。

良い習慣として知られている回避策はありますか、他の辞書のキーとして辞書のようなオブジェクトを使用する方法を知っている人はいませんか?

+0

あなたは 'collections.OrderedDict'に対して' str() 'を呼び出すことができますか? –

+0

関連:http://stackoverflow.com/q/30637306/674039 – wim

+0

@SimeonVisser OrderedDict:要素がディクテーションの値の一部として追加された順序を考慮しない限り、あなたは取得する動作に驚くかもしれません - 私は、OrderedDictがキーで順序付けられたツリーマップだと想像していましたが、悲しいかなか(このユースケースでは)そうではありません。 – phlip

答えて

3

辞書項目含むfrozensetの構築してこの問題の回避策素敵な、私を見つけた:bは不変であるfrozensetの、ある、コードに見ることができるように

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

をハッシュ可能であり、完全に修復されてaのような正規の辞書になります。

+1

これはdict値をキーと同様にハッシュ可能にする必要があることに注意してください。 – BrenBarn

+0

'frozenset'から' dict'に戻る方法についても言及しています – Mahdi

+0

これは、 'dict'オブジェクトの最高の特性を失うでしょう。つまり、キーによるルックアップは一定の時間に達成できます。 –

2

あなたはordered dictを試すか、これらの回答に見ることができます:

とは、PyPI上のパッケージもあります:https://pypi.python.org/pypi/frozendict

あなたはすることができます単純にdictをタプル(sorted(your_dict.items()))に変換し、ハッシュとして使用します。

UPD:コメントに記載されているように、OrderedDictはハッシュできません。私の悪い、それは本当に変更可能なので、ハッシュ可能ではありません。

+1

「OrderedDict」もハッシュ可能ではありません。 – jonrsharpe

+0

ソートされたタプルの代わりに 'frozenset'を使うことができることに注意してください。 – SomethingSomething