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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:45:38