如何基于深度值对Python嵌套列表进行结构化转换?
实现嵌套层级结构转换
核心思路:利用栈追踪层级关系
针对这种带深度标记的扁平列表,最直观的实现方式是用栈记录当前遍历路径上的各层级节点,通过深度对比找到父节点,逐步构建嵌套结构。
输入输出示例
假设输入为:
input_list = [ ["Root", 0, 0], ["Level1-1", 10, 1], ["Level2-1", 20, 2], ["Level1-2", 30, 1], ["Level2-2", 40, 2], ["Level3-1", 50, 3] ]
期望输出为嵌套字典结构:
{ "name": "Root", "value": 0, "children": [ { "name": "Level1-1", "value": 10, "children": [{"name": "Level2-1", "value": 20, "children": []}] }, { "name": "Level1-2", "value": 30, "children": [ { "name": "Level2-2", "value": 40, "children": [{"name": "Level3-1", "value": 50, "children": []}] } ] } ] }
可行代码实现
def build_nested_structure(input_data): if not input_data: return None # 初始化栈,存储(节点深度, 节点字典) stack = [] # 构建根节点并压入栈 root_name, root_val, root_depth = input_data[0] root_node = {"name": root_name, "value": root_val, "children": []} stack.append((root_depth, root_node)) for item in input_data[1:]: name, val, depth = item current_node = {"name": name, "value": val, "children": []} # 弹出栈中深度≥当前深度的节点,找到父节点 while stack and stack[-1][0] >= depth: stack.pop() # 将当前节点加入父节点的children列表 stack[-1][1]["children"].append(current_node) # 当前节点压入栈,作为后续子节点的候选父节点 stack.append((depth, current_node)) return root_node
关键逻辑说明
- 栈的作用:栈中始终保存当前路径上的层级节点,栈顶元素是当前节点的直接父节点。
- 深度匹配:遍历每个元素时,通过弹出栈中深度不小于当前深度的节点,确保剩下的栈顶节点深度恰好比当前节点小1,也就是父节点。
- 节点挂载:将当前节点加入父节点的
children列表,再把当前节点压入栈,供后续子节点使用。
注意事项
- 若输入列表未按层级顺序排列(比如子节点出现在父节点之前),需要先对输入排序,可保留原索引保证同层级节点顺序:
# 给每个元素添加原索引,排序后再恢复 indexed_data = [(idx, item) for idx, item in enumerate(input_list)] sorted_data = sorted(indexed_data, key=lambda x: (x[1][2], x[0])) input_sorted = [item for idx, item in sorted_data] - 若存在多个根节点(深度为0的元素),可修改代码返回根节点列表,而非单个根节点。
内容的提问来源于stack exchange,提问作者yazjack
相关产品推荐
相关产品推荐

