You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:16:25