在Python中合并两个嵌套的OrderedDicts

时间:2015-12-01 13:27:33

标签: python dictionary merge ordereddictionary

Comparing/combining two dictionaries后,我试图找出如何合并两个嵌套的OrderedDicts。

我的数据类似于此类,简化形式:

personA = OrderedDict([
         (u'score',
          OrderedDict([(u'2015-09-09 03:40:33 +0100', 2646), 
                       (u'2015-09-10 03:35:34 +0100', 2646), 
                      ])
         ),

         (u'adjusted_score',
          OrderedDict([(u'2015-09-09 03:40:33 +0100', 3646), 
                       (u'2015-09-10 03:35:34 +0100', 3646), 
                      ])
         )
    ]
)  

personB = OrderedDict([
         (u'score',
          OrderedDict([(u'2015-09-11 03:40:33 +0100', 4646), 
                       (u'2015-09-12 03:35:34 +0100', 4646), 
                      ])
         ), 

         (u'adjusted_score',
          OrderedDict([(u'2015-09-11 03:40:33 +0100', 5646), 
                       (u'2015-09-12 03:35:34 +0100', 5646), 
                      ])
         )
    ] 
) 

我想将'personA''personB'合并到一个新的output变量中,并使用personA的键(让我们假设它们实际上是同一个人)。

到目前为止,我已尝试过此代码,但所有值都会在列表中结束。我不介意是否覆盖任何数据,但输出必须包含相同的数据结构:

output = collections.OrderedDict()
for k,e in personA.items()+personB.items():
    output.setdefault(k,[]).append(e) 

1 个答案:

答案 0 :(得分:0)

如果我完全理解你的问题,你想要的是:

new_dict = OrderedDict([
    ('score',
     OrderedDict([(k, v) for k,v in personA['score'].items()]
         + [(k, v) for k,v in personB['score'].items()])), 
    ('adjusted_score',
     OrderedDict([(k, v) for k,v in personA['adjusted_score'].items()]
         + [(k, v) for k,v in personB['adjusted_score'].items()]))
    ])

你也可以做到同样的结果:

newd = OrderedDict()
for k in personA.keys():
    newd[k] = OrderedDict(
        [i for i in personA[k].items()] + [j for j in personB[k].items()]
    )

并验证结果:

>>> new_dict == newd
>>> True