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

