在Python 2.7中合并具有Dicts列表的Dicts

Ast*_*rea 3 python dictionary python-2.7

我试图dict在Python中合并两个s,可能是相同的,或者可以有更少的信息

恩.

master = {"a": 5564, "c": [{"d2":6}]}
daily = { "a": 795, "b": 1337, "c": [{"d1": 2,"d2": 2,"d3": [{"e1": 4,"e2": 4}]}]}
Run Code Online (Sandbox Code Playgroud)

它们需要合并,因此输出就是这样

master = { "a": 6359, "b": 1337, "c": [{"d1": 2,"d2": 8,"d3": [{"e1": 4,"e2": 4}]}]}
Run Code Online (Sandbox Code Playgroud)

虽然我只得到了返回null,但我还是试了一下.我可能会遗漏某些东西或者只是离开.我只是想不通.任何帮助都会很棒谢谢.

def merge(master,daily):
    for k, v in daily.items():
        if isinstance(daily[k],list):
            key_check = keyCheck(k, master)
            if key_check:
                merge(master[k],daily[k])
            else :
                master[k] = daily[k]
        else :
            if keyCheck(k, master):
                 master[k] += daily[k]
            else :
                master[k] = daily[k]
Run Code Online (Sandbox Code Playgroud)

keyCheck 只检查一个键是否在字典中,这样就不会抛出错误.

Kas*_*mvd 5

这是一个线性使用collections.Counter():

>>> from collections import Counter
>> C2 = Counter(daily)
>>> C1 = Counter(master)
>>> 
>>> {k:reduce(lambda x,y : Counter(x)+Counter(y), v) if isinstance(v, list) and k in (C1.viewkeys() & C2) else v for k, v in (C1 + C2).items()}
{'a': 6359, 'c': Counter({'d3': [{'e1': 4, 'e2': 4}], 'd2': 8, 'd1': 2}), 'b': 1337}
Run Code Online (Sandbox Code Playgroud)

首先,你可以将你的词典转换为Counter对象,以便在对计数器求和之后添加公共键的值(这就是Counter的add属性的工作方式),然后你可以遍历项目和两个计数器中存在的键和它们的键值是列表,您可以使用该reduce()函数将相同的算法应用于所有列表项.

如果列表包含另一个嵌套的类似数据结构,则可以将此代码转换为递归函数.