合并字典的词典

问题描述:

我想知道什么是结合字典的两个字典的最好/最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://*.com/a/40684691/984421)是什么你需要。 – ekhumoro

这只是一个简单的for循环:

for k in original: 
    original[k].update(update.get(k, {})) 

for k in update: 
    if k in original: 
      original[k].update(update[k]) 
    else: 
      original[k] = update[k] 

这是假设只有一个级别的嵌套。更深层的解决方案有望变得更加复杂。这也会改变字典original,这可能不是你想要的行为。

如果有每次两个层次,您可以使用双迭代:

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

您可以创建一个嵌套字典理解表达实现它:

{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'}}