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

Python嵌套字典合并异常:如何将子字典Zip值追加到父数组

问题:嵌套JSON字典的合并需求

我需要将第二个字典合并到作为基准的第一个父字典中,实际场景是逐行读取TSV文件,每行对应一个子字典,最终合并成单个嵌套JSON结构。

示例字典

  • 父字典(基准结构):dict1: {"CA": [{"Marin": [{"zip":1}], "population":10000}]}
  • 子字典:dict2: {"CA": {"Marin": {"zip":2}}}

注:dict1的JSON结构为正确基准,需将dict2中的zip:2追加到加利福尼亚州Marin县的数组中。

现有合并代码

class MyClass:
    # merges two lines containing json arrays inside nested json
    def merge_lines(dict1: dict, dict2: dict) -> dict:
      for key in dict1:
        if key in dict2:
            if isinstance(dict1[key], dict):
                MyClass.merge_lines(dict1[key], dict2[key])
            elif isinstance(dict1[key], list):
                to_be_merged_list = [dict2[key]]
                dict1[key].extend(to_be_merged_list)
      return dict1

测试用例

def test_nested_json_arrays(self):
   d1 = {"CA": [{"Marin": [{"zip":1}], "population":10000}]}
   d2 = {"CA": {"Marin": {"zip":2}}}
   expected_result = {"CA": [{"Marin": [{"zip":1}, {"zip":2}], "population":1000}]}
   actual = MyClass.merge_lines(d1, d2)
   assert expected_result == actual

注:测试用例中的expected_result存在笔误,population值应为10000而非1000,修正后的预期结果应为:{"CA": [{"Marin": [{"zip":1}, {"zip":2}], "population":10000}]}

错误信息

E      AssertionError: assert {'CA': [{'Mar...tion': 1000}]} == {'CA': [{'Mari... {'zip': 2}}]}
E        Differing items:
E        {'CA': [{'Marin': [{'zip': 1}, {'zip': 2}], 'population': 1000}]} != {'CA': [{'Marin': [{'zip': 1}], 'population': 10000}, {'Marin': {'zip': 2}}]}
E        Full diff:
E        - {'CA': [{'Marin': [{'zip': 1}, {'zip': 2}], 'population': 1000}]}
E        + {'CA': [{'Marin': [{'zip': 1}], 'population': 10000}, {'Marin': {'zip': 2}}]}

问题分析与修正代码

原代码的核心问题是:当遇到dict1中的列表类型值时,直接将dict2对应键的整个值追加到列表中,而非深入列表内部的字典结构,找到对应层级的数组进行元素追加。

修正后的代码会遍历列表中的字典元素,递归执行合并逻辑,确保将子字典的内容合并到基准结构的对应数组中:

class MyClass:
    # 合并嵌套JSON中的数组行
    def merge_lines(dict1: dict, dict2: dict) -> dict:
        for key in dict1:
            if key in dict2:
                val1 = dict1[key]
                val2 = dict2[key]
                if isinstance(val1, dict):
                    MyClass.merge_lines(val1, val2)
                elif isinstance(val1, list):
                    # 遍历基准列表中的每个字典元素,与子字典对应值合并
                    for item in val1:
                        if isinstance(item, dict):
                            MyClass.merge_lines(item, val2)
        return dict1

验证结果

使用修正后的代码运行测试用例(修正预期结果的笔误后),实际输出会与预期结果一致:
{"CA": [{"Marin": [{"zip":1}, {"zip":2}], "population":10000}]}

内容的提问来源于stack exchange,提问作者Aritra Nayak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:02:00