2016-08-29 17 views
1

どのように辞書のリストから辞書のセットを作ることができますか?辞書のリストを辞書のセットに変換する

例:

import copy 

v1 = {'k01': 'v01', 'k02': {'k03': 'v03', 'k04': {'k05': 'v05'}}} 
v2 = {'k11': 'v11', 'k12': {'k13': 'v13', 'k14': {'k15': 'v15'}}} 

data = [] 
N = 5 
for i in range(N): 
    data.append(copy.deepcopy(v1)) 
    data.append(copy.deepcopy(v2)) 

print data 

どのようにあなたがリストdataからの辞書のセットを作成するのでしょうか?

NS:1つの辞書は、構造的に同じ場合、同じ辞書になります。つまり、彼らはを正確に同じキーと同じ値(再帰的)

+0

必要なタプル出力は何ですか? –

+0

'data = set(data)'? – ForceBru

+1

@ForceBru 'TypeError:unhashable type: 'dict'' – BPL

答えて

3

安い回避策は、例えば、あなたのdictsをシリアル化するために、次のようになります。

import json 

dset = set() 

d1 = {'a':1, 'b':{'c':2}} 
d2 = {'b':{'c':2}, 'a':1} # the same according to your definition 
d3 = {'x': 42} 

dset.add(json.dumps(d1, sort_keys=True)) 
dset.add(json.dumps(d2, sort_keys=True)) 
dset.add(json.dumps(d3, sort_keys=True)) 

for p in dset: 
    print json.loads(p) 

長い目で見れば、それはSetOfDictsようなクラスで全体を包むように理にかなって。

+0

いいです!私はまだ反例を見つけることができませんでしたが、キーが辞書の深いレベルでシャッフルされても機能するようです。 – BPL

+0

@BPL:もちろん、これはあなたの辞書(およびすべてのサブ要素)がシリアライズ可能である限り機能します。 – georg

+0

十分な公正、私はそれで生きることができます;) – BPL

0

辞書は変更可能であり、したがって、Pythonでハッシュ可能ではありません。

__hash__メソッドを使用してdictサブクラスを作成することもできます。ディクショナリのハッシュがセット内にあるときに変更されないようにしてください(おそらく、メンバーの変更を許可できないことを意味します)。 frozendictsの実装例については、http://code.activestate.com/recipes/414283-frozen-dictionaries/を参照してください。

(フリーズした)辞書でソート順を定義できる場合は、代わりにセットではなくバイナリツリーに基づくデータ構造を使用することもできます。これは、下のリンクで提供されているbisectソリューションに変わります。

また、ハッシュのないセットが意味をなさない理由については、https://stackoverflow.com/a/18824158/5069869も参照してください。

+0

あなたは何かが既によく知られていることを指摘しましたが、質問への解決はありません – BPL

+0

あなたの質問は何ですか?なぜあなたはセットが欲しいのですか?重複を削除したいだけですか?あなたはセット操作を使いたいですか? – TheEspinosa

+2

@BPL 'dict'が'ハッシュ可能 'でないことを既に知っているなら、あなたの質問には何の意味もありません。どのようにして 'dicts'を作ることができますか?あなたは 'dict'の' keys'、 'dict'や' both'の 'values'のセットを作ることができますが、それ自体は指示しません –

関連する問題