Python嵌套字典的更新与新增字段实现方案问询
Python嵌套字典增量更新实现方案
针对你需要的仅新增/更新字段、不删除原有内容、数组按identifier匹配更新的需求,这里提供一个递归实现的可行方案,核心是分类型处理字典和列表的嵌套结构:
核心实现函数
def merge_nested_data(target, source): # 处理嵌套字典:增量键存在则递归更新,不存在则新增 if isinstance(target, dict) and isinstance(source, dict): for key, value in source.items(): if key in target: merge_nested_data(target[key], value) else: # 对嵌套结构做复制,避免后续修改影响原始增量数据 if isinstance(value, dict): target[key] = value.copy() elif isinstance(value, list): target[key] = [item.copy() if isinstance(item, dict) else item for item in value] else: target[key] = value # 处理列表:基于identifier匹配更新,未匹配则追加 elif isinstance(target, list) and isinstance(source, list): # 先建立初始列表中带identifier元素的索引映射 identifier_map = {} for idx, item in enumerate(target): if isinstance(item, dict) and 'identifier' in item: identifier_map[item['identifier']] = idx # 遍历增量列表,处理每个元素 for source_item in source: if isinstance(source_item, dict) and 'identifier' in source_item: ident = source_item['identifier'] if ident in identifier_map: # 匹配到已有元素,递归更新字段 merge_nested_data(target[identifier_map[ident]], source_item) else: # 未匹配到,追加新元素 target.append(source_item.copy() if isinstance(source_item, dict) else source_item) else: # 无identifier的元素直接追加(可根据需求调整逻辑) target.append(source_item.copy() if isinstance(source_item, (dict, list)) else source_item) # 基础类型直接覆盖(如字符串、数字等) else: if isinstance(source, (dict, list)): target = source.copy() else: target = source return target
功能说明
- 字典处理:
- 遍历增量字典的所有键,若目标字典已有该键,则递归进入嵌套结构更新
- 若目标字典无该键,直接新增键值对(对嵌套结构做复制,避免引用污染)
- 列表处理:
- 先把初始列表中带
identifier的元素存入字典映射(键为identifier,值为元素索引) - 遍历增量列表元素,匹配到identifier则更新对应索引的元素,未匹配则追加到列表末尾
- 对无identifier的列表元素,直接追加(可根据业务需求修改此逻辑)
- 先把初始列表中带
- 字段保留:仅处理增量中存在的键/元素,初始数据中未被增量覆盖的内容会完整保留
测试示例
# 初始完整数据 initial_data = { "name": "DeviceX", "mdm": { "app": [ {"identifier": "com.apple.mail", "version": "1.0", "enabled": True}, {"identifier": "com.apple.safari", "version": "2.0"} ], "settings": {"auto_update": False} } } # 增量更新数据 delta_data = { "mdm": { "app": [ {"identifier": "com.apple.mail", "version": "1.1"}, {"identifier": "com.apple.maps", "version": "3.0", "enabled": True} ], "settings": {"auto_update": True, "backup": True} }, "status": "active" } # 执行合并 merge_nested_data(initial_data, delta_data) # 打印结果(格式化输出) import json print(json.dumps(initial_data, indent=2))
输出结果
{ "name": "DeviceX", "mdm": { "app": [ { "identifier": "com.apple.mail", "version": "1.1", "enabled": true }, { "identifier": "com.apple.safari", "version": "2.0" }, { "identifier": "com.apple.maps", "version": "3.0", "enabled": true } ], "settings": { "auto_update": true, "backup": true } }, "status": "active" }
可调整逻辑
- 如果需要限制列表仅处理带
identifier的元素,可以删除无identifier元素的追加逻辑 - 如果需要严格校验增量数据的类型匹配,可以在递归前添加类型检查,避免类型不匹配的覆盖
- 如果需要保留列表的原始排序逻辑,当前实现已满足(原有元素顺序不变,新增元素在末尾)
内容的提问来源于stack exchange,提问作者jimjim32
相关产品推荐
相关产品推荐

