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

时间:2016-09-01 18:34:16

标签: python python-2.7 dictionary

我正在尝试合并Python中的两个dict,这可能是相同的,或者可能会有更少的信息

离。

master = {"a": 5564, "c": [{"d2":6}]}
daily = { "a": 795, "b": 1337, "c": [{"d1": 2,"d2": 2,"d3": [{"e1": 4,"e2": 4}]}]}

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

master = { "a": 6359, "b": 1337, "c": [{"d1": 2,"d2": 8,"d3": [{"e1": 4,"e2": 4}]}]}

虽然我只得到了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]

keyCheck仅检查字符是否在字典中,因此不会抛出错误。

2 个答案:

答案 0 :(得分:5)

这是使用<appSettings> <add key="CSharpBackendPortNumber" value="num"/> <add key="CSharpWorkerPath" value="C:\MobiusRelease\samples\CSharpWorker.exe"/> </appSettings>

的一个线性
sparkclr-submit.cmd debug

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

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

答案 1 :(得分:1)

这是一个递归解决方案。虽然它无法与Kasramvd的答案竞争。

def merge(dic1, dic2):

    merged = dict(dic1, **dic2) # Merge dictionaries without adding values. Just exchanging them.
                                # Similar to .update() but does not override subdicts.

    for key in merged:
        if key in dic1 and key in dic2:
            if isinstance(dic1[key], list):
                merged[key] = merge(dic1[key][0], dic2[key][0])
            else:
                merged[key] = dic1[key] + dic2[key]

    return merged