2015-10-11 54 views
1

我有兩個字典,輸出factorintsympy.ntheory。我需要將它們合併,以便常用鍵得到它們的值總和,即MergedDict[key] = Dict1[key] + Dict2[key],而唯一鍵保持不變。在Python合併兩個字典,以便他們的鍵被添加/減去

此外,我需要得到一個merged詞典與常見的鍵不同,即MergedDict[key] = Dict1[key] - Dict2[key]。這裏的Dict2鍵將永遠是Dict1鍵的子集,所以沒有負數的問題。我試過關注this question。但我無法使其工作。到目前爲止,我的方法是如下:

from sympy.ntheory import factorint 
from collections import defaultdict 

d=factorint(12) 
dd = defaultdict(lambda: defaultdict(int)) 
for key, values_dict in d.items(): 
      for date, integer in values_dict.items(): 
       dd[key] += integer 

for n in range(2,6): 
    u = factorint(n) 

    for key, values_dict in u.items(): 
     for date, integer in values_dict.items(): 
      dd[key] += integer 

它給人的錯誤AttributeError: 'int' object has no attribute 'items'。以上代碼僅用於總結部分。然而,在差分部分上做任何事情時,假設可以改變總結以在常見密鑰的情況下用於差分。

+0

d是一個'dict'對象輸出由'factorint',不知道你的「爲什麼你期待的字典是什麼意思?」。如果方法不對,請告訴。 – Frash

+0

yes factorint是一個字典,但存儲在字典中的值不是字典。你的代碼中的'values_dict'是一個int而不是字典 –

回答

2

不知道你的目標是,但factorint給整數你們鍵/值對,所以你應該總結的值,你試圖調用items每個VAL從dict這是一個整數,顯然行不通:

from sympy.ntheory import factorint 
    from collections import defaultdict 

    d=factorint(12) 
    dd = defaultdict(int) 
    for key, val in d.items(): 
     dd[key] += val 

    for n in range(2, 6): 
     u = factorint(n) 
     for key, val in u.items(): 
       dd[key] += val 

    print(dd) 

輸出:

defaultdict(<type 'int'>, {2: 5, 3: 2, 5: 1}) 

factorint被一個字典不能有重複鍵,以便在第一循環利用卡恩更新來完成:

d = factorint(12) 
dd = defaultdict(int) 
dd.update(d) 

for n in range(2, 6): 
    u = factorint(n) 
    for key, val in u.items(): 
      dd[key] += val 
+0

是的,這就是我正在尋找的東西。 Python新手,這麼多事情要了解。謝謝你的回答 – Frash

+0

@Frash,不用擔心,如果你遇到'print'是你的朋友調試 –

1

看來collections.Counter可以做你想要的大部分。這可能是因爲(安裝未經測試,我沒有sympy)一樣簡單:

from collections import Counter 
cnt1 = Counter(Dict1) 
cnt2 = Counter(Dict2) 
sum_cnt = cnt1 + cnt2 
diff_cnt = cnt1 - cnt2 
+0

經過測試,效果很好。謝謝回答 – Frash