2016-10-01 41 views
1

給定兩個字典,我想看看他們的差異和差異,並執行f元素相交和獨特的元素執行g,以下是我如何找出獨特和相交元素是哪裏d1和d2是兩個字典,我如何打印出d_intersection和d_difference作爲元組內的字典?輸出應該是這個樣子({交叉鍵,值},{差異鍵,值}) 例如:給定兩個字典的相交和差異

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

從輸出看起來你想要一個包含兩個字典的元組。函數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

非常感謝! 行all_keys =集(d1.keys()+ d2.keys()) 給出了一個錯誤 類型錯誤:不支持的操作數類型(S)爲+: 'dict_keys' 和 'dict_keys' – user6820366

2

你得到一個KeyError異常爲爲^將查找對稱差這意味着鍵獨特要麼,鍵兩者。你也不需要創建集,您可以使用返回的view object從主叫.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))作品爲對稱差因爲當我們從d2唯一鍵捕獲。

爲python2代碼稍有不同,你需要用.viewkeys更換.keys獲得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} 

拿到兩個集之間的僅僅是差異,即什麼是在一個,但不是在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

所以對稱差異僅在兩個字典中都不存在時纔會捕獲值,但只有一個?我想要這兩個字典中的任何元素都不存在於另一個字典中。就像{5:80}不存在於d2中一樣,我也想要類似的想法{4:70,6:90},因爲它們不存在於d1中。我可以研究這些集合和集合的交集的好來源嗎?感謝您回答btw – user6820366

+0

@ user6820366,兩組的對稱差異將包含來自任一組的獨特元素。我添加了一些更多的例子。 –

+0

我明白了,這是有道理的,對稱差異是每個詞典中鍵的差異的聯合。謝謝,這是非常豐富的:D – user6820366