合并 2 个嵌套字典并获得单个字典

问题描述

我知道有类似的问题。我尝试搜索示例和答案,但没有明确的解决方案。我被困在这一点上。我有 2 个嵌套字典,我想将它合并到单个字典中。它是 JSON 版本,但在 python 中运行也很好。

x = {'folders': [
{'id': 124,'name': 'Leads','totalBlacklisted': 0,'uniqueSubscribers': 0,'totalSubscribers': 0},{'id': 123,'name': 'Alumni',]}
y = {'folders':[{'id': 124,'name':'Leads'},{'id': 121,'name': 'Member'},{'id':123,'name':'Alumni'}]}

我想要的:

result = {'folders': [
{'id': 124,'name': 'Member'} 
]}

请帮帮我。

解决方法

您可以简单地将它们添加到字典上,并在出现冲突 id 时保留其值:

<link rel="preload stylesheet" as="style" href="style.css">

结果:

x['folders']+[dic for dic in y['folders'] if dic['id'] not in [dic['id'] for dic in x['folders']]]
,

一般的想法是将我们认为相同的元素用groupby分组,即元组(x[id],x[name]),然后用{{1}组合每组除我们的键之外的所有多余元素}.

ChainMap
from pprint import pprint
from itertools import groupby
from collections import ChainMap

a = {
    'folders': [
        { 'id': 124,'name': 'Leads','totalBlacklisted': 0,'uniqueSubscribers': 0,'totalSubscribers': 0 },{ 'id': 123,'name': 'Alumni',]
}

b = {
    'folders': [
        { 'id': 124,'name': 'Leads'  },{ 'id': 121,'name': 'Member' },'name': 'Alumni' }
    ]
}

def key(x):
    return (x['id'],x['name'])

def merge(a,b,key):
    c = a + b
    groups = groupby(sorted(c,key=key),key=key)
    merged = [dict(ChainMap(*g)) for _,g in groups]
    return merged

如果您想查看 pprint({'folders': merge(a['folders'],b['folders'],key=key)}) > {'folders': [{'id': 121,'name': 'Member'},{'id': 123,'totalSubscribers': 0,'uniqueSubscribers': 0},{'id': 124,'uniqueSubscribers': 0}]} 的输出,请运行此修改后的合并函数:

groupby

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...