2013-11-24 110 views
0

我試圖把兩個字典合併成一個(新)字典,但我一直有問題。我得到這個錯誤信息:把兩個字典合併爲一個

'NoneType' object is not iterable 

這是沒有意義的,因爲我在函數中定義的R1和R2:

def combine_report(r1, r2): 
    to_merge=[r1,r2] 
    d={} 
    for m in to_merge: 
     for k,v in m.items(): 
      d.setdefault(k,{}).update(v) 
    return d 
+1

什麼是你作爲此輸入使用詞典? –

回答

1

您應該d直接使用.update()

def combine_report(r1, r2): 
    d = r1.copy() 
    d.update(r2) 
    return d 

您試圖將鍵設置爲空詞典,然後對那些只有值的用戶調用.update();這要求該值爲可迭代;如果一個新書的值是None這會導致您的具體情況例外:

>>> {}.update(None) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'NoneType' object is not iterable 

通過使用簡單的項目分配你的版本可以「修復」:

def combine_report(r1, r2): 
    to_merge = [r1, r2] 
    d={} 
    for m in to_merge: 
     for k, v in m.items(): 
      d[k] = v 
    return d 

但使用.update()像顯示在我的版本將會更有效率。

如果你必須在每個鍵列表中保存的所有值,然後使用:

def combine_report(r1, r2): 
    d = {} 
    for m in to_merge: 
     for k, v in m.items(): 
      d.setdefault(k, []).append(v) 
    return d 

這裏,dict.setdefault()將返回鍵k價值,但如果k尚不存在設置的默認值(這裏是一個列表)。

+0

'更新'比字典理解更有效嗎? – thefourtheye

+0

@thefourtheye:我希望如此,是的。 C代碼可以重用現有的字典結構,並且C中的循環隨時可以在Python中循環。 –

+0

你的意思是,理解是用Python實現的,而不是C? – thefourtheye

0

而不是

d.setdefault(k,{}).update(v) 

你應該

d.setdefault(k,[]).append(v) 

去,因爲,你想只值更新詞典。你實際需要的是與鍵對應的值列表。所以,整個程序變成這樣

def combine_report(r1, r2): 
    to_merge, d = [r1,r2], {} 
    for m in to_merge: 
     for k,v in m.items(): 
      d.setdefault(k,[]).append(v) 
    return d 

print(combine_report({"1":"a"}, {"1":"b"})) 

輸出

{'1': ['a', 'b']} 
+0

這是否將它們結合在一起,即使它們對於一個鍵具有相同的值?我不希望任何值被替換。如果我有一個報告爲{'1':'a'},另一個報告爲{'1':'b'}我想獲得{'1':'a','b'} – user2976821

+0

@ user2976821請檢查我的更新的答案。它會按照您的預期行事。 – thefourtheye

+0

謝謝。 setdefualt。()函數做了什麼? – user2976821