Python递归函数作用域处理:嵌套JSON属性扁平化问题
提取嵌套JSON中的properties为扁平列表
给定JSON输入:
{"nodes": [ {"properties": { "id": "rootNode", "name": "Bertina Dunmore"}, "nodes": [ {"properties": { "id": 1, "name": "Gwenneth Rylett", "parent_id": "rootNode"}, "nodes": [ {"properties": { "id": 11, "name": "Joell Waye", "parent_id": 1}}, {"properties": { "id": 12, "name": "Stan Willcox", "parent_id": 1}}]}, {"properties": { "id": 2, "name": "Delbert Dukesbury", "parent_id": "rootNode"}, "nodes": [ {"properties": { "id": 21, "name": "Cecil McKeever", "parent_id": 2}}, {"properties": { "id": 22, "name": "Joy Obee", "parent_id": 2}}]}]}]}
需求是将所有嵌套的properties字典提取为一个扁平的字典列表。
能写出递归打印所有properties的函数:
def get_node(nodes): for node in nodes: print(node['properties']) if 'nodes' in node.keys(): get_node(node['nodes'])
但尝试收集到列表时遇到问题:
def get_node(nodes): prop_list = [] for node in nodes: print(node['properties']) prop_list.append(node['properties']) if 'nodes' in node.keys(): get_node(node['nodes']) return prop_list
该函数仅返回[{'id': 'rootNode', 'name': 'Bertina Dunmore'}],但所有properties都能正常打印。
问题原因
递归调用get_node(node['nodes'])时,每次都会生成一个新的列表,但你没有把这个新列表中的元素合并到当前层的prop_list里,导致只有最上层的元素被保留。
解决方法
方法一:合并递归返回的列表
修改函数,将递归调用返回的列表元素扩展到当前列表中:
def get_node(nodes): prop_list = [] for node in nodes: prop_list.append(node['properties']) # 检查当前节点是否包含子节点 if 'nodes' in node: # 将子节点递归返回的列表合并到当前列表 prop_list.extend(get_node(node['nodes'])) return prop_list
方法二:通过参数传递共享列表
初始化一个列表,通过参数传递给递归函数,避免每次创建新列表:
def get_node(nodes, prop_list=None): # 首次调用时初始化空列表 if prop_list is None: prop_list = [] for node in nodes: prop_list.append(node['properties']) if 'nodes' in node: get_node(node['nodes'], prop_list) return prop_list
测试效果
调用函数并传入JSON的nodes部分:
# 假设data是你的JSON数据 result = get_node(data['nodes']) print(result)
将得到包含所有7个properties的扁平列表:
[ {'id': 'rootNode', 'name': 'Bertina Dunmore'}, {'id': 1, 'name': 'Gwenneth Rylett', 'parent_id': 'rootNode'}, {'id': 11, 'name': 'Joell Waye', 'parent_id': 1}, {'id': 12, 'name': 'Stan Willcox', 'parent_id': 1}, {'id': 2, 'name': 'Delbert Dukesbury', 'parent_id': 'rootNode'}, {'id': 21, 'name': 'Cecil McKeever', 'parent_id': 2}, {'id': 22, 'name': 'Joy Obee', 'parent_id': 2} ]
内容的提问来源于stack exchange,提问作者mrgou
相关产品推荐
相关产品推荐

