You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Python标题列表构建指定层级的树形结构?

解决方案:构建指定格式的层级树形结构

针对你的需求,我们可以通过解析标题的层级关系、维护节点父子关联,再生成目标格式的树形文本。以下是完整实现:

核心思路

  1. 区分标题层级:带数字编号的标题通过点数判断层级(如13.3.含2个点,对应层级2;13.3.1.含3个点,对应层级3);无编号的标题直接归属上一个带编号的节点作为子节点。
  2. 标记节点属性:给每个节点标记是否为父节点的最后一个子节点,用于生成正确的缩进和竖线符号。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:43:19