讲师中心 微信公众号
AI工具推荐 视频效率加速

将缩进格式的树状字符串转换为路径列表的完整教程

大静君_7815

大静君_7815

发布时间:2026-01-26 15:30:22

|

623人浏览过

|

来源于php中文网

原创

将缩进格式的树状字符串转换为路径列表的完整教程

本文介绍如何将基于空格缩进表示层级关系的树状字符串,精准解析为标准的斜杠分隔路径列表,涵盖单空格缩进与不规则缩进两种场景,并提供健壮、可复用的 python 实现方案。

在实际数据处理中(如解析配置文件、日志目录结构或嵌套菜单文本),我们常遇到以缩进表达父子关系的树形字符串。这类结构直观易读,但需转化为程序友好的路径列表(如 ["Fruits/Red/Apple"])才能用于后续的路径匹配、目录创建或树重建。关键挑战在于:缩进层级 ≠ 字符数,而是语义层级;且原始字符串中的 ! 仅为结束标记,无实际节点含义,应忽略。

下面提供两种渐进式解决方案:

✅ 场景一:规整缩进(每级严格增加 1 个空格)

若输入保证缩进由单空格逐级递增(如 Red 前 1 空格、Apple 前 2 空格),可使用轻量级状态跟踪法:

huaweicloud-python-sdk-helper
huaweicloud-python-sdk-helper

华为云 Python SDK 查询工具。自动发现已安装 SDK 的服务包、Client类、API 方法、入参详情、类信息(__init__ 参数、属性、类型、描述),支持关键字搜索,快速定位目标 API 使用方法。

下载
def get_paths_uniform(lines):
    path = []  # 动态维护当前路径各层级节点
    for line in lines.splitlines():
        stripped = line.lstrip()
        # 跳过空行和结束标记 '!'
        if not stripped or stripped == '!':
            continue
        indent = len(line) - len(stripped)  # 计算当前缩进空格数
        # 若缩进变浅,说明上一个完整路径已结束 → 输出并截断路径
        if indent < len(path):
            yield "/".join(path[:indent])
        # 更新当前层级节点(覆盖或追加)
        if indent >= len(path):
            path.append(stripped)
        else:
            path[indent] = stripped
    # 输出最后一段路径(末尾无缩进变化触发)
    if path:
        yield "/".join(path)
? 原理简析:path 列表索引即对应层级深度(0=根,1=子层…)。当某行缩进 indent=2,但 len(path)=3,说明已进入更深层,需先输出 path[:2] 表示前两级构成的完整路径;再用新内容更新 path[2]。

✅ 场景二:不规则缩进(支持 2空格、4空格、Tab 混合等)

现实文本常含不一致缩进(如 2 空格→4 空格→Tab)。此时需显式记录每级缩进量,而非依赖“空格数=层级”假设:

def get_paths_flexible(lines):
    path = []
    indents = [0]  # 存储各层级对应的缩进量,indents[i] 是第 i 层的缩进值
    for line in lines.splitlines():
        stripped = line.lstrip()
        if not stripped or stripped == '!':
            continue
        indent = len(line) - len(stripped)

        # 回溯:弹出所有缩进 ≥ 当前行的层级(即退出父级)
        while len(indents) > 1 and indent <= indents[-2]:
            indents.pop()
            path.pop()

        # 新层级:缩进严格大于栈顶 → 推入新层级
        if indent > indents[-1]:
            indents.append(indent)
            path.append(stripped)
        # 同级更新:缩进等于栈顶 → 替换当前层级节点
        elif indent == indents[-1]:
            path[-1] = stripped
        # 缩进小于栈顶?逻辑上不应发生(已被while处理),此处安全兜底
        else:
            path.append(stripped)  # 或抛异常:缩进异常

    # 清理残留路径
    if path:
        yield "/".join(path)

⚠️ 注意事项:

  • 两个函数均跳过纯空行及单独 ! 行,确保鲁棒性;
  • get_paths_flexible 中 indents 栈机制确保层级映射绝对准确,即使缩进为 [0, 2, 6, 8] 也能正确识别四层结构;
  • 若需兼容 Tab(\t),建议预处理:lines.replace('\t', ' ') 统一为空格。

✅ 使用示例与验证

s = """\
Shoes
Fruits
 Red
  Apple
  Cherry
 !
 Yellow
  Banana
  Grapes
   Small
   Big
  !
 !
!"""

result = list(get_paths_flexible(s))
print(result)
# 输出:
# ['Shoes', 'Fruits/Red/Apple', 'Fruits/Red/Cherry', 
#  'Fruits/Yellow/Banana', 'Fruits/Yellow/Grapes/Small', 
#  'Fruits/Yellow/Grapes/Big']

该方案时间复杂度为 O(n),空间复杂度 O(h)(h 为最大深度),适用于千行级树结构解析。核心思想是——用栈管理层级状态,用缩进量驱动路径构建,而非简单字符替换。掌握此模式,可轻松扩展支持 YAML-like 缩进、Markdown 目录树等更多场景。

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2844

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5949

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7554

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

11254

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

5779

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

6347

2025.08.07

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn