Python如何递归合并含相同子字典键的字典?合并page的results数组
Python合并嵌套字典并整合指定列表元素
问题描述
有两个带嵌套结构的字典(DictA、DictB),需要在保留原有整体结构的前提下,将两者中['page']['results']下的列表元素整合到一起,避免出现列表被后续字典覆盖的情况。
示例数据
DictA
dict_a = { "page": { "results": [ { "id": "164895045", "type": "page", "status": "current", "title": "Testeintrag", "extensions": {"position": "none"}, "_links": { "webui": "/display/Orga/Testeintrag", "edit": "/pages/resumedraft.action?draftId=164895045" }, "_expandable": { "container": "/rest/api/space/OrgaIB15", "metadata": "" } } # 省略其他results元素 ] # 保留page下的其他键(如果存在) } # 保留字典其他顶层键(如果存在) }
DictB
dict_b = { "page": { "results": [ { "id": "169020312", "type": "page", "status": "current", "title": "IDERA Tools", "extensions": {"position": "none"}, "_links": { "webui": "/display/Orga/IDERA+Tools", "edit": "/pages/resumedraft.action?draftId=169020312" }, "_expandable": { "container": "/rest/api/space/Orga", "metadata": "" } } # 省略其他results元素 ] # 保留page下的其他键(如果存在) } # 保留字典其他顶层键(如果存在) }
解决方案
方法1:针对性手动合并(适合固定结构)
直接复制原有字典结构,单独拼接results列表,避免覆盖整个嵌套字典:
# 复制dict_a的整体结构(浅拷贝,若有深层可变对象可改用deepcopy) merged_dict = dict_a.copy() # 复制page子字典,防止修改原字典的page内容 merged_page = merged_dict["page"].copy() # 拼接两个字典的results列表 merged_page["results"] = dict_a["page"]["results"] + dict_b["page"]["results"] # 将合并后的page放回总字典 merged_dict["page"] = merged_page
方法2:通用递归合并函数(适合复杂/可变嵌套结构)
如果需要处理更复杂的嵌套结构,或者未来结构可能变化,可以用递归函数实现:遇到嵌套字典则递归合并,遇到列表则拼接,其他类型键按需求处理(以下示例中重复键用后者覆盖,可根据需要调整):
from copy import deepcopy def merge_nested_dicts(base_dict, new_dict): # 深拷贝基准字典,避免修改原数据 merged = deepcopy(base_dict) for key, value in new_dict.items(): if key in merged: # 嵌套字典则递归合并 if isinstance(merged[key], dict) and isinstance(value, dict): merged[key] = merge_nested_dicts(merged[key], value) # 列表则拼接 elif isinstance(merged[key], list) and isinstance(value, list): merged[key].extend(value) # 其他类型键,用new_dict的值覆盖base_dict(可根据需求修改) else: merged[key] = value else: # 基准字典中没有的键,直接添加 merged[key] = value return merged # 使用函数合并 merged_dict = merge_nested_dicts(dict_a, dict_b)
为什么之前的方法会导致覆盖?
普通的字典update()方法或直接赋值(如merged = dict_a; merged['page'] = dict_b['page'])会直接替换整个page子字典,而不是合并其中的results列表。必须针对性处理列表的拼接逻辑,才能实现元素整合而非覆盖。
内容的提问来源于stack exchange,提问作者Marcus J
相关产品推荐
相关产品推荐

