如何为Python标题列表构建指定层级的树形结构?
解决方案:构建指定格式的层级树形结构
针对你的需求,我们可以通过解析标题的层级关系、维护节点父子关联,再生成目标格式的树形文本。以下是完整实现:
核心思路
- 区分标题层级:带数字编号的标题通过点数判断层级(如
13.3.含2个点,对应层级2;13.3.1.含3个点,对应层级3);无编号的标题直接归属上一个带编号的节点作为子节点。 - 标记节点属性:给每个节点标记是否为父节点的最后一个子节点,用于生成正确的缩进和竖线符号。
- 拼接树形文本:根据节点层级和是否为最后子节点,拼接对应的前缀和树形符号。
完整代码
titles = [ '13.3. Risk', '13.3.1. Strategy', 'SubStrategy', '13.3.2. Token', 'Material', 'Impact', 'Aling' ] def parse_title_level(title): # 解析带编号标题的层级,无编号返回None if title[0].isdigit(): num_segment = title.split(' ')[0] # 点数即为层级(13.3. → 2个点 → 层级2) level = num_segment.count('.') return level, title return None, title # 构建节点列表,记录层级、父节点 stack = [] tree_nodes = [] for title in titles: level, t = parse_title_level(title) if level is not None: # 弹出栈中层级不小于当前层级的节点,找到父节点 while stack and stack[-1]['level'] >= level: stack.pop() parent = stack[-1] if stack else None node = {'level': level, 'title': t, 'parent': parent} stack.append(node) tree_nodes.append(node) else: # 无编号标题挂在栈顶节点下 if not stack: # 无父节点时按根节点处理 node = {'level': 1, 'title': t, 'parent': None} tree_nodes.append(node) stack.append(node) else: parent = stack[-1] node = {'level': parent['level'] + 1, 'title': t, 'parent': parent} tree_nodes.append(node) # 按父节点分组,标记每个节点是否为最后一个子节点 parent_map = {} for node in tree_nodes: parent = node['parent'] if parent not in parent_map: parent_map[parent] = [] parent_map[parent].append(node) for parent, children in parent_map.items(): for idx, child in enumerate(children): child['is_last'] = (idx == len(children) - 1) # 生成树形文本 def generate_tree(): tree_str = '' # 处理根节点(层级2的节点) roots = [n for n in tree_nodes if n['level'] == 2] for root in roots: tree_str += f"|_'{root['title']}'\n" # 处理根节点的子节点(层级3) for child in parent_map.get(root, []): tree_str += f" |____'{child['title']}'\n" # 处理子节点的子节点(层级4) prefix = ' ' if child['is_last'] else ' | ' for grand_child in parent_map.get(child, []): tree_str += f"{prefix}|____'{grand_child['title']}'\n" # 移除最后多余的换行 return tree_str.rstrip('\n') # 输出结果 print(generate_tree())
运行结果
|_'13.3. Risk' |____'13.3.1. Strategy' | |____'SubStrategy' |____'13.3.2. Token' |____'Material' |____'Impact' |____'Aling'
内容的提问来源于stack exchange,提问作者Sebas Fernández
相关产品推荐
相关产品推荐

