如何在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
相关产品推荐
相关产品推荐

