如何在Python中基于含父子关联的层级数据构建树结构
Python 层级关联数据集构建树结构实现方案
核心实现逻辑
整个过程不需要引入额外第三方库,原生Python即可实现,核心思路是用字典做索引避免嵌套循环查找,时间复杂度仅为O(n),完全适配大型数据集处理:
- 第一步:构建所有节点的ID索引,为每个节点预初始化
children字段存储子节点 - 第二步:遍历所有节点,根据父ID匹配对应父节点,将自身加入父节点的子节点列表
- 第三步:筛选无父节点(或父ID为预设根节点标识)的节点作为树根,得到完整树结构
可直接运行的代码示例
假设你的原始数据格式为列表,每个元素包含id(子节点编号)、parent_id(父节点编号)、name(节点名称)三个核心字段,从csv、数据库读取的数据可先整理为该格式:
# 示例原始数据,可替换为你的实际业务数据 raw_data = [ {"id": 1, "parent_id": 0, "name": "汽车"}, {"id": 2, "parent_id": 0, "name": "飞机"}, {"id": 3, "parent_id": 1, "name": "动力系统"}, {"id": 4, "parent_id": 1, "name": "车身系统"}, {"id": 5, "parent_id": 3, "name": "发动机"}, {"id": 6, "parent_id": 3, "name": "变速箱"}, {"id": 7, "parent_id": 2, "name": "机翼"}, {"id": 8, "parent_id": 2, "name": "机身"}, ] def build_tree(data, root_parent_id=0): # 构建ID到节点的映射字典,避免重复循环查找 node_map = {} for item in data: # 复制原数据避免修改原始数据集,新增children字段存储子节点 node_map[item["id"]] = {**item, "children": []} forest = [] for item in data: node_id = item["id"] parent_id = item["parent_id"] current_node = node_map[node_id] if parent_id == root_parent_id: # 父ID为根节点标识,直接加入根节点列表 forest.append(current_node) else: # 匹配到父节点后,将当前节点加入父节点的子列表 if parent_id in node_map: node_map[parent_id]["children"].append(current_node) return forest # 调用函数生成树结构 tree = build_tree(raw_data) # 打印验证结果,可替换为你需要的输出格式(比如JSON、嵌套列表等) import json print(json.dumps(tree, ensure_ascii=False, indent=2))
扩展适配说明
- 如果你的根节点标识不是
0,调用build_tree时传入对应root_parent_id参数即可,比如根节点父ID为None就传root_parent_id=None - 如果你的数据字段名不是
id/parent_id,修改代码中对应的字段名即可快速适配 - 需要输出可视化树结构的话,可以递归遍历生成带缩进的文本格式,也可引入
anytree等第三方库实现图形化输出 - 处理百万级以上超大型数据集时,可提前对数据按
parent_id排序,进一步降低运行时内存占用
内容的提问来源于stack exchange,提问作者brownie_coder
相关产品推荐
相关产品推荐

