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

如何在Python中基于父子关系数据生成JSON

递归遍历父子关系类表的完整实现

我看你已经搭好了父子关系的DataFrame结构,还有递归遍历的雏形,现在帮你补全代码并梳理清楚逻辑:

1. 原始数据结构

首先是你定义的带有父子关系的资产类表数据:

import pandas as pd

data_df = pd.DataFrame(
    {
        "id": [1, 2, 3, 4, 5, 6, 7, 8],
        "parent_id": [0, 0, 1, 1, 3, 3, 3, 4],
        "name": ['assetX', 'assetY', 'assetZ', 'assetQ', 'assetW', 'assetM', 'assetN', 'assetH']
    }
)

这个结构里,parent_id=0代表根节点,其他节点通过parent_id关联到父节点的id。

2. 补全后的递归遍历函数

你原来的函数写到一半,我帮你补全并修正了变量名的小错误(原来的p...应该是parent_id),同时增加了更清晰的子节点输出逻辑:

def get_children(data_df, parent_id):
    print(f"当前父节点ID: {parent_id}")
    # 筛选出当前父节点的所有子节点
    children_df = data_df.loc[data_df['parent_id'] == parent_id]
    # 如果存在子节点,遍历每个子节点并递归查找它们的子节点
    if not children_df.empty:
        for _, child in children_df.iterrows():
            print(f"├─ 子节点: ID={child['id']}, 名称={child['name']}")
            # 递归调用,查找当前子节点的子节点
            get_children(data_df, child['id'])
    else:
        print("  └─ 无下级子节点")

3. 函数调用示例

比如我们要遍历根节点(parent_id=0)的所有子节点:

get_children(data_df, 0)

运行后会输出树形结构的遍历结果:

当前父节点ID: 0
├─ 子节点: ID=1, 名称=assetX
当前父节点ID: 1
├─ 子节点: ID=3, 名称=assetZ
当前父节点ID: 3
├─ 子节点: ID=5, 名称=assetW
当前父节点ID: 5
  └─ 无下级子节点
├─ 子节点: ID=6, 名称=assetM
当前父节点ID: 6
  └─ 无下级子节点
├─ 子节点: ID=7, 名称=assetN
当前父节点ID: 7
  └─ 无下级子节点
├─ 子节点: ID=4, 名称=assetQ
当前父节点ID: 4
├─ 子节点: ID=8, 名称=assetH
当前父节点ID: 8
  └─ 无下级子节点
├─ 子节点: ID=2, 名称=assetY
当前父节点ID: 2
  └─ 无下级子节点

4. 小优化建议

  • 如果需要返回遍历结果而不是直接打印,可以把结果存入列表或者字典,方便后续处理
  • 对于大数据量的表,可以先把数据转换成字典(比如以parent_id为键,子节点列表为值),这样递归时不用每次都查询DataFrame,提升效率:
# 预构建父子映射字典
parent_child_map = data_df.groupby('parent_id')['id'].apply(list).to_dict()

def get_children_optimized(parent_id, depth=0):
    indent = "  " * depth
    print(f"{indent}当前父节点ID: {parent_id}")
    children = parent_child_map.get(parent_id, [])
    if children:
        for child_id in children:
            child_name = data_df.loc[data_df['id'] == child_id, 'name'].iloc[0]
            print(f"{indent}├─ 子节点: ID={child_id}, 名称={child_name}")
            get_children_optimized(child_id, depth+1)
    else:
        print(f"{indent}  └─ 无下级子节点")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:17:08