2016-11-18 250 views
1

我想知道什麼是結合字典的兩個字典的最好/最pythonic方式。合併字典的詞典

我有兩個字典看起來像這樣:

original = {'user1': {'COL': 'green', 'ID': '234235', 'NAME': 'andy'}, 
      'user2': {'COL': 'blue', 'ID': '234234', 'NAME': 'john'}} 

update = {'user1': {'COL': 'black', 'ID': '234235', 'NAME': 'andy'}, 
      'user2': {'COL': 'purple', 'SPEC': 'na'}} 

我想將它們合併在一起,這樣在update字典中值將在original詞典更新相應的值。

result = {'user1': {'COL': 'black', 'ID': '234235', 'NAME': 'andy'}, 
      'user2': {'COL': 'purple', 'ID': '234234', 'NAME': 'john', 'SPEC': 'na'}} 

我一直在使用collectionscopy試過,但是,我最終更換爲重點的整個價值。

+0

'update'是否可以包含一個'user'而不是'original'? – ekhumoro

+0

@ekhumoro,不,更新不會包含不在'原始' –

+0

'用戶'在這種情況下,[回答@ wim](http://stackoverflow.com/a/40684691/984421)是什麼你需要。 – ekhumoro

回答

1

這只是一個簡單的for循環:

for k in original: 
    original[k].update(update.get(k, {})) 
0
for k in update: 
    if k in original: 
      original[k].update(update[k]) 
    else: 
      original[k] = update[k] 

這是假設只有一個級別的嵌套。更深層的解決方案有望變得更加複雜。這也會改變字典original,這可能不是你想要的行爲。

0

如果有每次兩個層次,您可以使用雙迭代:

for user, values in update.iteritems(): 
    for k, v in values.iteritems(): 
     original[user][k] = v 
0

您可以創建一個嵌套字典理解表達實現它:

{k1: {k2: update[k1].get(k2, v2) for k2, v2 in v1.items()} for k1, v1 in original.items()} 

這將retu rn值:

{'user2': {'ID': '234234', 'NAME': 'john', 'COL': 'purple'}, 'user1': {'ID': '234235', 'NAME': 'andy', 'COL': 'black'}}