2014-06-14 22 views
1

我有兩本詞典中減去的元素,比方說:從字典

dict_a = {"A": 3.0, "C": 4.0, "B": 6.0} 
dict_b = {"A": 3.0, "C": 5.0, "D": 1.0} 

,我想計算減法dict_a - dict_b所以輸出給我:

{"A": 0.0, "B": 6.0, "C": -1.0, "D": -1.0} 

Google上搜尋了一段時間我看到使用計數器來執行這樣的操作的人,但是做一些簡單的事情,如

dict(Counter(dict_a) - Counter(dict_b)) 

只給了我

{"A": 0.0, "B": 6.0} 

即,如果該鍵不dict_a,它不會出現在輸出中。

到目前爲止,我已經成功了以下解決方案:

dict_b2 = dict_b.copy() 
dict_c = {} 
for i in dict_a.keys(): 
    dict_c.update({i: dict_a[i] - dict_b2.pop(i,0.0)}) 
    # Changes sign to the remaining values from dict_b2 
dict_c.update({k: 0.0 - v for k, v in dict_b2.iteritems()}) 

,但我知道必須有這樣做的更優雅和有效的方式。

任何想法?

+0

「C」和「D」鍵被丟棄,因爲計數器會丟棄具有負數的鍵。 –

+0

@mgilson對不起,我忘記提及它只發生在減法操作過程中。 –

+0

@ 200OK - 是的,我剛剛注意到,當我更多地查看文檔時。它有一個'.subtract'方法是一件好事! :-) – mgilson

回答

7

事實證明,Counter有一個(不是非常有據可查)subtract方法:

>>> dict_a = {"A": 3.0, "C": 4.0, "B": 6.0} 
>>> dict_b = {"A": 3.0, "C": 5.0, "D": 1.0} 
>>> from collections import Counter 
>>> a = Counter(dict_a) 
>>> a.subtract(dict_b) 
>>> a 
Counter({'B': 6.0, 'A': 0.0, 'C': -1.0, 'D': -1.0}) 

注意,這不從約束「低於0沒有價值」,這是對Counter.__sub__徵收吃虧,但它確實執行就地

有一點是很酷的是,我不需要將這兩個字典轉換爲Counter - 只有操作左邊的那個。

+0

+1以前從未見過。 –

+3

@ 200OK - 我也沒有。如果這種行爲不存在於其他地方,那麼'__sub__'的行爲看起來真的很奇怪,所以我進行了探索。 – mgilson

+0

哦,我應該在......之前看到這是完美的!謝謝 :) – eSedano

3

您可以嘗試使用字典理解

new_dict = {k:dict_a.get(k, 0) - dict_b.get(k, 0) 
      for k in dict_a.keys() + dict_b.keys()} 

# {'A': 0.0, 'C': -1.0, 'B': 6.0, 'D': -1.0} 

這裏我們使用dict#get(key, default),避免受到KeyError(當鑰匙不屬於其中的一個詞典)。

+1

該解決方案也非常好,謝謝!但是這次我會用減法:) – eSedano