2017-03-17 17 views
0

キーの値が複数ある2つの辞書の違いを知りたいと思います。私が見つけたすべての例では、辞書には1つの値しか含まれていないキーがあります。私は、キーと値の両方を含む2つの辞書で唯一の相違点を返したいPython 3:辞書のキーと値のペアの違いを表示

pizza_1 = {"toppings": ["cheese", "pepperoni", "mushroom"], 
      "crust": ["deep dish", "hand tossed", "thin"], 
      "size": ["large", "medium", "small"], 
      "price": ["$12.99", "$9.99", "$7.99"]} 

pizza_2 = {"toppings": ["cheese", "pepperoni", "olive"], 
      "crust": ["deep dish", "traditional", "thin"], 
      "size": ["large", "medium", "small"], 
      "brand": ["Domino's", "Pizza Hut", "Little Caesars"]} 

:あなたは次の例のように、複数の値を持つキーを持っていると言います。ピザ1とピザ2の違い、どちらの辞書でも問題ありません。私は以下を探しているものの例:

print(differences) 
"toppings": ["mushroom"] 
"crust": ["hand tossed"] 
"price": ["$12.99", "$9.99", "$7.99"] 

私はそれが出力する方法を正確にわからないんだけど、私は一種のを探しています何の例を与えたいと思いました。助けにあなたの時間を取るための事前に感謝!

+2

これまでに何を試みましたか? –

+0

キーは常に同じですか?もしそうでなければ、そのような鍵はどうなるのでしょうか? –

+0

こんにちはマルティン、助けてくれてありがとう!理論的には鍵は同じでなければならないが、鍵が同じでない可能性もある。キーが同じでない場合、私はその違いを示すようにしたいと思います。 – jmm5351

答えて

2

ループキーの組合を介して、値as setsを治療し、set difference印刷:私は辞書のキーの組合を提供するために、ここにdict.keys() dictionary viewを使用してい

for key in pizza_1.keys() | pizza_2: # union of the dict views 
    difference = set(pizza_1.get(key, [])).difference(pizza_2.get(key, [])) 
    if difference: 
     print(key, list(difference)) 

ifテストは空の結果をフィルタリングします。

あなたは辞書としてこれを望んでいた場合は、ジェネレータ式を加えた複数回のセットを生産避けるためにdictの理解と1を生成することができます:

differences = ((key, list(set(pizza_1.get(key, [])).difference(pizza_2.get(key, [])))) 
       for key in pizza_1.keys() | pizza_2) 
differences = {k: v for k, v in differences if v} 

デモ:

>>> for key in pizza_1.keys() | pizza_2: # union of the dict views 
...  difference = set(pizza_1.get(key, [])).difference(pizza_2.get(key, [])) 
...  if difference: 
...   print(key, list(difference)) 
... 
crust ['hand tossed'] 
toppings ['mushroom'] 
price ['$9.99', '$7.99', '$12.99'] 
>>> differences = ((key, list(set(pizza_1.get(key, [])).difference(pizza_2.get(key, [])))) 
...    for key in pizza_1.keys() | pizza_2) 
>>> {k: v for k, v in differences if v} 
{'crust': ['hand tossed'], 'toppings': ['mushroom'], 'price': ['$9.99', '$7.99', '$12.99']} 
+0

ここで何が起こっているのかを最も簡単に説明できますか?私はまだPythonを学んでいて、辞書は私がよりよく理解する必要がある領域です。 pizza_1.keys()のキーのために| pizza_2:#dictビューの和集合 difference = set(pizza_1.get(key、[]))difference(pizza_2.get(key、[]) print ) set()とget()がここで何をしているのか分かりません。また、差分変数に等しい行があるので、どのように.difference()を使うか。 ありがとう、 -Jeff – jmm5351

+0

@ jmm5351:関連ドキュメントにリンクしようとしました( 'dict。get() ')そこにあります。私が含んでいるリンクを読むことは大部分をカバーするべきです;欠落している唯一のリンクは、['dict.get()'](https://docs.python.org/3/library/stdtypes.html#dict.get)です。これは、指定されたキーの値を返すか、キーがない場合のデフォルトです。 –

+0

@ jmm5351: 'pizza_1.keys()| pizza_2'は、両方の辞書のキーのセットを生成するので、一方または他方の辞書にある一意のキーの組み合わせです。 'dict.get()'はそのキーの値を取得するか、その辞書にない場合は空のリストを取得します。 'set(..)。difference(..)'は、2つのリストの違いをとります。 –

1

-Jeff

私はあなたの出力データ構造として、セット値を持つ辞書を提案します。

>>> {k: set(v).difference(pizza_2.get(k, {})) for k, v in pizza_1.items()} 
{'price': {'$9.99', '$7.99', '$12.99'}, 'size': set(), 'toppings': {'mushroom'}, 'crust': {'hand tossed'}} 

結果には違いがない(サイズ参照)キーの空のセットが保持されます。

+0

これは、差分dictに特別な 'size:set()'要素を与えます – Jerfov2

0

何私はキーをループして、リストの補完を使って違いを得ました(具体的にはpizza_1にあり、出力の例に示すようにpizza_2にはありません)。

def getDiff(dict1, dict2): 
    diff = {} 

    for key in dict1: 
     if key not in dict2: 
      diff[key] = dict1[key] 
     elif dict1[key] != dict2[key]: 
      diff[key] = [e for e in dict1[key] if e not in dict2[key]] 

    return diff 
関連する問題