2017-03-17 59 views
0

我想找出具有多個鍵值的字典之間的差異。所有我發現的例子,詞典都有一個只包含一個值的鍵。假設你有一個有多個值,如下面的例子鍵: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"]} 

我只想返回在兩個庫包括鍵和值兩者的差異。無論是pizza_1還是pizza_2的差異,哪個字典都無所謂。我正在尋找下面的例子:

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

我不確定它將如何輸出,但想給我的例子尋找。預先感謝您花時間幫助!

-Jeff

+2

到目前爲止您嘗試過什麼? –

+0

鑰匙是否總是一樣?如果不是,這種密鑰會發生什麼? –

+0

Hello Martijn,非常感謝您的幫助!從理論上講,按鍵應該是相同的,但按鍵可能不一樣。如果鑰匙不一樣,我希望也可以顯示出不同之處。 – jmm5351

回答

2

遍歷鍵的結合,治療價值as sets並打印set difference

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)) 

我使用dict.keys() dictionary view這裏提供字典鍵的結合。 if測試會過濾掉空的結果。

如果你想這是一個字典,你可以產生一個與發電機表情加上一個字典的理解,以避免產生套不止一次:

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.get(key,[])) 如果有差異: ) 我不確定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(..)'然後取兩個列表之間的差異。 –

1

我建議用設置值的字典作爲你的輸出數據結構。

>>> {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

這在差異字典中給出了一個額外的'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