2013-04-24 14 views
3

假設我有2點字典:計數在2個詞典所有的差異,並顯示他們全部

A = {'banana':10, 'apple':2, 'pear':5, 'orange':3} 
B = {'banana':7, 'orange':5, 'strawberry':4, 'blueberry':1, 'kiwi':10} 

現在,我需要打印這些字典的所有的差異,並顯示它們(即使是關鍵在A不是在B或其他),當然在絕對值,所以結果應該是:

c = {'banana':3, 'apple':2, 'pear':5, 'orange':2, 'strawberry':4, 'blueberry':1, 'kiwi':10} 

任何想法?我以前看過一些帖子,但只是部分回答了這個需求。

在此先感謝!

+0

在Python中,你要引用一個字典的鍵:'{ '香蕉':10,...} ' – kay 2013-04-24 16:42:10

+1

刪除了「設置差異」標記,因爲這是一個不同的概念:http://en.wikipedia.org/wiki/Complement_(set_theory) – 2013-04-24 16:57:05

回答

6

使用collections.Counter

from collections import Counter 

A = {'banana':10, 'apple':2, 'pear':5, 'orange':3} 
B = {'banana':7, 'orange':5, 'strawberry':4, 'blueberry':1, 'kiwi':10} 

A_Counter, B_Counter = Counter(A), Counter(B) 

print((A_Counter - B_Counter) | (B_Counter - A_Counter)) 

輸出:

Counter({'kiwi': 10, 'pear': 5, 'strawberry': 4, 'banana': 3, 'apple': 2, 'orange': 2, 'blueberry': 1}) 
+2

+1,正是我想要的正確版本:) – 2013-04-24 16:46:16

+1

我想你應該在打印語句中使用圓括號。當然,它工作得很好,但它看起來錯了。 :-) – kay 2013-04-24 16:48:01

+0

@Kay:你說得對,括號更清楚。看到我編輯的帖子。 – 2013-04-24 16:56:43

4

在py2x A.viewkeys() | B.viewkeys()將返回鍵的聯合,從兩個A & B,然後你可以使用字典理解,以獲得所需結果。

In [14]: A = {'banana':10, 'apple':2, 'pear':5, 'orange':3} 

In [15]: B = {'banana':7, 'orange':5, 'strawberry':4, 'blueberry':1, 'kiwi':10} 

In [16]: {x : abs(A.get(x,0) - B.get(x,0)) for x in A.viewkeys() | B.viewkeys()} 
Out[16]: 
{'apple': 2, 
'banana': 3, 
'blueberry': 1, 
'kiwi': 10, 
'orange': 2, 
'pear': 5, 
'strawberry': 4} 

對於py3x使用:A.keys() | B.keys()

對於這兩種py2x和py3x:set(A).union(B)

+0

你可以使用'A.viewkeys()| B.viewkeys()'在沒有創建中間集合的情況下從兩個字典中獲得密鑰的聯合。請參見[字典視圖對象](http://docs.python.org/2/library/stdtypes.html#dictionary-view-objects)。 – 2013-04-24 17:20:20

+0

@MartijnPieters我知道他們,但沒有使用它們,因爲'viewkeys'只能在py2x中使用,對於py3x我們必須使用'.keys()'。 – 2013-04-24 17:32:40

+0

我通常會明確提到,具體取決於問題上的標籤。 – 2013-04-24 17:34:03

相關問題