合并嵌套词典列表

时间:2017-10-13 08:37:30

标签: python list dictionary

我有两个词典列表,如下面的示例所示

list1=[
        {
            "pdpData":{
                "a":1,
                "b":2
            }
        }
    ]

list2=[
    {
        "pdpData":{
            "a":1,
            "c":3
        }
    },
    {
        "pdpData":{
            "a":2,
            "b":3
        }
    }
]

我希望结果如下面的格式所示

list3=[
{
    "pdpData":{
        "a":1,
        "b":2,
        "c":3
    }
},
{
    "pdpData":{
        "a":2,
        "b":3
    }
}
]

list1和list2的大小可以是10000。 List3将是list1和list2的并集。什么是解决这个问题的最好的pythonic解决方案。

2 个答案:

答案 0 :(得分:1)

你没有写任何代码,所以我不会写一个完整的解决方案。您需要zip_longestdict merging

from itertools import zip_longest

list1=[
        {
            "pdpData":{
                "a":1,
                "b":2
            }
        }
    ]

list2=[
    {
        "pdpData":{
            "a":1,
            "c":3
        }
    },
    {
        "pdpData":{
            "a":2,
            "b":3
        }
    }
]


for d1, d2 in zip_longest(list1, list2):
    dd1 = d1.get("pdpData", {}) if d1 else {}
    dd2 = d2.get("pdpData", {}) if d2 else {}
    print({**dd1, **dd2})

输出:

{'a': 1, 'b': 2, 'c': 3}
{'a': 2, 'b': 3}

现在你已经合并了内部词,你需要做的就是将它们打包到另一个dict作为键,"pdpData"作为键,并将这些词组打包成一个列表。

答案 1 :(得分:0)

from collections import defaultdict

d = defaultdict(dict)
for l in (l1, l2):
    for elem in l:
        d[elem['pdpData']['a']].update(elem['pdpData'])
l3 = d.values()

print(l3)

输出

dict_values([{'a': 1, 'b': 2, 'c': 3}, {'a': 2, 'b': 3}])