2016-07-25 2 views
1

私は辞書の交差点を見て、セットライブラリを使用しようとしましたが、値を表示する方法を理解することができず、キーを操作するだけでなく、いくつかの助けが必要です。私はキーが辞書A、B、およびCであるかを把握し、新しい辞書にそれらを結合する必要がさまざまなサイズの3つのdictsが与えられた場合、交差点と値はどのように見えますか?

dict_a= {1: 488, 2: 336, 3: 315, 4: 291, 5: 275} 

dict_b={2: 0, 3: 33, 1: 61, 5: 90, 15: 58} 

dict_c= {1: 1.15, 9: 0, 2: 0.11, 15: 0.86, 19: 0.008, 20: 1834} 

:私は、ランダムな長さの3つの辞書を持っています。次に、辞書A & BまたはA & CまたはB & Cにあるキーを特定し、それらを新しい辞書に引き出す必要があります。私がA、B、Cに残しておくべきことは、その辞書に固有のものです。

次のように、最終的に、私は、別の辞書で羽目になるだろう:

total_intersect= {1: {488, 61, 1.15}, 2: {336, 0, 0.11}} 
A&B_only_intersect = {3: {315,33}, 5:{275,90}} (then dicts for A&C intersect and B&C intersect) 
dict_a_leftover= {4:291} (and dicts for leftovers from B and C) 

私はジッパーを使用して考えたが、それはすべてのそれらの値がそれぞれの場所に滞在することが重要です、私は」できることを意味tはCの位置にAの値を持つ。どんな助けも素晴らしいだろう!

+0

'' common_keys = dict_a.keys()&dict_b.keys()&dict_c.keys() '(もし' '.keys()'を '' .viewkeys () ')。次に、結合された辞書を構築する方法を思いついてみてください。 – Bakuriu

+0

どのバージョンのPythonですか?ビューオブジェクトはおそらく必要な処理を行いますが、構文は2と3の間で異なります。 – cdarke

+2

_ "Cの位置にAの値を持つことはできません" - 順序付けられていないディクテーションとセットを使用しています。あなたが話すこの「ポジション」は何ですか? –

答えて

1
lst = [dict_a,dict_b,dict_c] 
    total_intersect_key = set(dict_a) & set(dict_b) & set(dict_c) 
    total_intersect = { k:[ item[k] for item in lst ] for k in total_intersect_key} 

出力:

:他の質問に対する

{1: [488, 61, 1.15], 2: [336, 0, 0.11]} 

だけでも、あなたが関数に

def intersect(lst): 
    return { k:[ item[k] for item in lst if k in item ] for k in reduce(lambda x,y:set(x)&set(y), lst) } 

例を変換することができLST要素

lst = [dict_a,dict_b] 
A&B_only_intersect = { k:[ item[k] for item in lst ] for k in set(dict_a.keys) & set(dict_b)} 

を減らします

>>> a 
{1: 488, 2: 336, 3: 315, 4: 291, 5: 275} 
>>> b 
{1: 61, 2: 0, 3: 33, 5: 90, 15: 58} 
>>> c 
{1: 1.15, 2: 0.11, 9: 0, 15: 0.86, 19: 0.008, 20: 1834} 
>>> intersect([a,b]) 
{1: [488, 61], 2: [336, 0], 3: [315, 33], 5: [275, 90]} 
>>> intersect([a,c]) 
{1: [488, 1.15], 2: [336, 0.11]} 
>>> intersect([b,c]) 
{1: [61, 1.15], 2: [0, 0.11], 15: [58, 0.86]} 
>>> intersect([a,b,c]) 
{1: [488, 61, 1.15], 2: [336, 0, 0.11]} 

-----更新-----

def func(lst, intersection): 
    if intersection: 
     return { k:[ item[k] for item in lst if k in item ] for k in reduce(lambda x,y:set(x)&set(y), lst) } 
    else: 
     return { k:[ item[k] for item in lst if k in item ] for k in reduce(lambda x,y:set(x).difference(set(y)), lst) } 

>>> func([a,c],False) 
{3: [315], 4: [291], 5: [275]} 
>>> func([a,b],False) 
{4: [291]} 
>>> func([func([a,b],False),func([a,c],False)],True) 
{4: [[291], [291]]} 

一つの問題:あなたが最終的な結果のために重複を取るか、自分自身funcを改善しようとする必要があります。

{k:set(reduce(lambda x,y:x+y, v)) for k,v in func([func([a,b],False),func([a,c],False)],True).iteritems()} 

{4: set([291])} 
+0

うわー、関数の例は超エレガントです、ありがとう! – user3097421

+0

@ user3097421問題ありません。 – galaxyan

+0

それで、A上だけでBやCではない人を見つけたいのであれば、すべての交差点を最初に見つけて、数式を設定しなければなりませんか? – user3097421

0

私は、これは同様にuがセットの、使用してb、cの "違い" に残り物を見つけることができます

dict_a= {1: 488, 2: 336, 3: 315, 4: 291, 5: 275} 
a = set(dict_a) 
dict_b={2: 0, 3: 33, 1: 61, 5: 90, 15: 58} 
b = set(dict_b) 
dict_c= {1: 1.15, 9: 0, 2: 0.11, 15: 0.86, 19: 0.008, 20: 1834} 
c = set(dict_c) 

a_intersect_b = a & b 

a_intersect_c = a & c 

b_intersect_c = b & c 

a_interset_b_intersect_c = a_intersect_b & c 


total_intersect = {} 
for id in a_interset_b_intersect_c: 
    total_intersect[id] = { dict_a[id] , dict_b[id] , dict_c[id] } 

print total_intersect 


a_b_only_intersect = {} 
for id in a_intersect_b: 
    a_b_only_intersect[id] = { dict_a[id] , dict_b[id] } 

print a_b_only_intersect 

b_c_only_intersect = {} 
for id in b_intersect_c: 
    b_c_only_intersect[id] = { dict_b[id] , dict_c[id] } 

print b_c_only_intersect 

a_c_only_intersect = {} 
for id in a_intersect_c: 
    a_c_only_intersect[id] = { dict_a[id] , dict_c[id] } 

print a_c_only_intersect 

を助けるかもしれない願っています。

関連する問題