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

修复JSON扁平化递归函数的AttributeError并实现目标结构

JSON列表扁平化实现错误修复

问题描述

原始JSON结构:

{
    "Teams" : ["Dortmund", "Real Madrid"] ,
    "Countries" : [
        "Colombia",
        {
            "Italia" : ["Milan", "Inter", "Juventus"]
        },
        {
            "France" : ["PSG", "Lille"]
        },
        "China"
    ]
}

期望扁平化后的字典:

{"Teams": ["Dortmund", "Real Madrid"], "Countries":["Colombia", "Italia", "Milan", "Inter", "Juventus", "France", "PSG", "Lille", "China" ]}

编写的递归函数:

def flatten_json(data):
    result = {}
    for key, value in data.items():
        if isinstance(value, dict):
            result.update(flatten_json(value))
        elif isinstance(value, list):
            for i, item in enumerate(value):
                result.update(flatten_json(item))
        else:
            result[key] = value
    return result

运行时出现错误:

Traceback (most recent call last):
  File "prueba.py", line 46, in <module>
    flattened_dict = flatten_json(organigram)
  File "prueba.py", line 36, in flatten_json
    result.update(flatten_json(item))
  File "prueba.py", line 31, in flatten_json
    for key, value in data.items():
AttributeError: 'str' object has no attribute 'items'

错误原因分析

函数递归逻辑错误:处理列表元素时,不管元素类型直接调用flatten_json(item),当元素是字符串(如"Colombia")时,函数尝试调用data.items(),但字符串没有items方法,因此抛出AttributeError。同时原函数的逻辑不符合需求——它试图合并所有键值对,而非将嵌套的列表结构展开为平级字符串列表。

解决方案代码

针对需求调整逻辑,只处理列表中的嵌套结构,保留原始键并生成平级列表:

def flatten_json(data):
    result = {}
    for key, value in data.items():
        if isinstance(value, list):
            flattened_list = []
            for item in value:
                if isinstance(item, str):
                    # 字符串直接加入结果列表
                    flattened_list.append(item)
                elif isinstance(item, dict):
                    # 先添加字典的键(国家名)
                    for country, clubs in item.items():
                        flattened_list.append(country)
                        # 再扩展俱乐部列表的所有元素
                        flattened_list.extend(clubs)
            result[key] = flattened_list
        else:
            # 非列表类型直接保留原内容
            result[key] = value
    return result

# 测试用例
organigram = {
    "Teams": ["Dortmund", "Real Madrid"],
    "Countries": [
        "Colombia",
        {"Italia": ["Milan", "Inter", "Juventus"]},
        {"France": ["PSG", "Lille"]},
        "China"
    ]
}

print(flatten_json(organigram))

运行结果

{'Teams': ['Dortmund', 'Real Madrid'], 'Countries': ['Colombia', 'Italia', 'Milan', 'Inter', 'Juventus', 'France', 'PSG', 'Lille', 'China']}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:07:13