Python中带level列的扁平数据转树形结构方案咨询
问题
给定如下扁平层级数据:
[ { "level":0, "name":"python" }, { "level":1, "name":"food" }, { "level":2, "name":"banana" }, { "level":3, "name":"protein" }, { "level":2, "name":"apple" }, { "level":1, "name":"fuel" } ]
需要将其转换为嵌套树形结构:
[ { "level":0, "name":"python", "children":[ { "level":1, "name":"food", "children":[ { "level":2, "name":"banana", "children":[ { "level":3, "name":"protein", "children":[] } ] }, { "level":2, "name":"apple", "children":[] } ] }, { "level":1, "name":"fuel", "children":[] } ] } ]
要求用Python实现,不依赖外部库或pandas。
解决方案
可以通过维护一个层级栈跟踪当前各层级的父节点,遍历扁平数据时根据节点的level找到对应父节点,将其添加到父节点的children列表中。
实现代码如下:
def flat_to_tree(flat_data): tree = [] level_stack = [] # 栈中保存各层级的最后一个节点,索引对应level值 for item in flat_data: # 复制当前元素并初始化children列表 node = item.copy() node['children'] = [] current_level = node['level'] # 调整栈长度,确保栈能对应到当前层级的父级 while len(level_stack) > current_level: level_stack.pop() if current_level == 0: # 根节点直接加入树并压入栈 tree.append(node) level_stack.append(node) else: # 父节点是栈中最后一个元素 parent_node = level_stack[-1] parent_node['children'].append(node) # 当前层级为下一层时,压入栈 if len(level_stack) == current_level: level_stack.append(node) return tree # 测试数据 flat_data = [ {"level":0,"name":"python"}, {"level":1,"name":"food"}, {"level":2,"name":"banana"}, {"level":3,"name":"protein"}, {"level":2,"name":"apple"}, {"level":1,"name":"fuel"} ] # 转换并打印格式化结果 import json tree = flat_to_tree(flat_data) print(json.dumps(tree, indent=2))
代码说明
- 层级栈
level_stack:栈内元素对应不同层级的节点,栈的长度等于当前最高层级+1。例如处理level=3的节点时,栈中会保存level0、level1、level2的节点。 - 节点处理逻辑:
- 复制原始节点并添加空的
children列表,避免修改原数据。 - 根据当前节点的
level调整栈:若栈长度大于current_level,说明当前节点是上一级的兄弟节点,弹出栈中多余元素直到栈长度匹配current_level。 - 根节点直接加入结果树并压入栈;非根节点找到栈顶的父节点,将自身加入父节点的
children,若当前层级为下一层级则压入栈。
- 复制原始节点并添加空的
内容的提问来源于stack exchange,提问作者Potato
相关产品推荐
相关产品推荐

