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
相关产品推荐
相关产品推荐

