2016-10-01 3 views
1

2つのディクショナリが与えられているので、それらの交点と違いを見て、交差する要素に対してf関数を実行して、固有の要素にgを実行したいと思います。 d1とd2は2つの辞書です。どのようにd_intersectionとd_differenceをタプルの中の辞書として出力するのですか?出力は、たとえば次のようなもの({交差キー、値}、{差異キー、値}) を見てください。2つのディクショナリの交点と違い

与え
d1 = {1:30, 2:20, 3:30, 5:80} 

d2 = {1:40, 2:50, 3:60, 4:70, 6:90} 

を出力({1: 70, 2: 70, 3: 90}, {4: 70, 5: 80, 6: 90})

dic = {} 
d_intersect = set(d1) & set(d2) 
d_difference = set(d1)^set(d2) 
for i in d_intersect: 
    dic.update({i : f(d1[i],d2[i])}) 
for j in d_difference: 
    dic.update({j : g(d1[j],d2[j])}) 

する必要があります誰か教えてもらえますどこが間違っていたのですか?私のコードがキーエラー4を引き起こすのはなぜですか?

+1

提案:あなたの質問はわかりにくく、わかりにくく、コードは奇妙に見えます。どのようなプログラミング言語ですか?あなたが特定の出力を期待しているが入力を提供していないとすれば、あなたが探しているものを理解することはほとんど不可能です。 – Andry

+0

申し訳ありません、それを今編集しました。そのpythonとクイズの質問の一つと私はそれを解決しようとしていた。私は非常に私のコードは非常に醜い見えるように私は非常にPythonの新しいです – user6820366

+0

出力から、2つの辞書のタプルが欲しいのように見えます。関数dict_interdifは単一の辞書を与えます。 –

答えて

1

もっと効率的な方法があるかもしれませんが、これを行う方法はここにあります。

d1 = {1:30, 2:20, 3:30, 5:80} 
d2 = {1:40, 2:50, 3:60, 4:70, 6:90} 

d_intersect = {} # Keys that appear in both dictionaries. 
d_difference = {} # Unique keys that appear in only one dictionary. 

# Get all keys from both dictionaries. 
# Convert it into a set so that we don't loop through duplicate keys. 
all_keys = set(d1.keys() + d2.keys()) # Python2.7 
#all_keys = set(list(d1.keys()) + list(d2.keys())) # Python3.3 

for key in all_keys: 
    if key in d1 and key in d2: 
     # If the key appears in both dictionaries, add both values 
     # together and place it in intersect. 
     d_intersect[key] = d1[key] + d2[key] 
    else: 
     # Otherwise find out the dictionary it comes from and place 
     # it in difference. 
     if key in d1: 
      d_difference[key] = d1[key] 
     else: 
      d_difference[key] = d2[key] 

Output:

{1: 70, 2: 70, 3: 90}

{4: 70, 5: 80, 6: 90}

+1

コードの仕組みを説明してもらえますか、私はあまりにも多くのことを知っていますが、このコードがどのように機能しているかを知りたいので、独自のコードを自分で作ることができます。ありがとうございました。 – user6820366

+0

確かに、私はコメントを含むでしょう。 –

+0

ありがとうございます!+のためにサポートされていないオペランドのタイプ(S): 'dict_keys' と 'dict_keys' – user6820366

2

あなたはためKeyError例外を取得^キーのいずれかに固有のを意味対称差を探して、キーが両方でではありません。あなたはまた、我々はd2から一意のキーを取得するとき、それはキャッチとしてあなたが対称差を呼びかけ.keys

d1 = {1: 30, 2: 20, 3: 30, 5: 80} 

d2 = {1: 40, 2: 50, 3: 60, 4: 70, 6: 90} 

# d1.keys()^d2 -> {4, 5, 6}, 4, 6 unique to d2, 5 unique to d1. 
symm = {k: d1.get(k, d2.get(k)) for k in d1.keys()^d2} 
inter = {k: d2[k] + d1[k] for k in d1.keys() & d2} 

d1.get(k, d2.get(k))作品から返さview objectを使用することができ、セットを作成する必要はありません。

python2のコードはわずかに異なっている、あなたは、2つのセットの間だけ違いを取得するにはview object:

{k: d1.get(k, d2.get(k)) for k in d1.viewkeys()^d2} 
{k: d2[k] + d1[k] for k in d1.viewkeys() & d2} 

を取得するために.viewkeys.keysを交換する必要がありますBではなく、中にあるもの、つまり、あなたは-必要があります。

In [1]: d1 = {1: 30, 2: 20, 3: 30, 5: 80} 

In [2]: d2 = {1: 40, 2: 50, 3: 60, 4: 70, 6: 90} 

In [3]: {k: d2[k] for k in d2.keys() - d1} 
Out[3]: {4: 70, 6: 90} 

In [4]: {k: d1[k] for k in d1.keys() - d2} 
Out[4]: {5: 80} 
In [5]: d2.keys() - d1 # in d2 not in d1 
Out[5]: {4, 6} 

In [6]: d1.keys() - d2 # in d1 not in d2 
Out[6]: {5} 

In [7]: d1.keys()^d2 # unique to either 
Out[7]: {4, 5, 6} 

対称差は、違いの労働組合をしているようなものです

In [12]: d1.keys() - d2 | d2.keys() - d1 
Out[12]: {4, 5, 6} 

すべての演算子については、Python docsで説明しています。また、Set_(mathematics)のwikiページでは、概要を説明しています。

+0

対称差分は、両方の辞書に存在しない場合にのみ値をキャッチしますが、1つだけです。私はどちらの辞書にも存在しない要素を両方の辞書から欲しかった。 {5:80}がd2になかったように、同様に私は{4:70、6:90}を望んでいました。彼らがd1に存在しなかったので、私はこれらのセットと交差点で調べることができます。答えをbtw – user6820366

+0

@ user6820366ありがとう、2つのセットの対称的な違いは、そのセットに固有のいずれかのセットからの要素を含みます。私はいくつかの例を追加しました。 –

+0

私は、対称的な違いは、各辞書のキーの違いの和集合です。 D – user6820366

関連する問題