<p>根据sal的评论,如果您已经有了路径列表,那么这很容易,并且不需要递归:</p>
<pre><code>>>> info = [
... "Parent/SiteA",
... "Parent/SiteB",
... "Parent/SiteC",
... "Parent/SiteD",
... "Parent/SiteD/xyz",
... "Parent/SiteE",
... "Parent/SiteD/xyz/Site8",
... "Parent/SiteE/def",
... "Parent/SiteF/Site3",
... "Parent/SiteF",
... "Parent/SiteF/Site4",
... "Parent/SiteF/Site5",
... ]
>>>
>>> info.sort()
>>> for line in info:
... print(' '*line.count('/') + line.split('/')[-1])
...
SiteA
SiteB
SiteC
SiteD
xyz
Site8
SiteE
def
SiteF
Site3
Site4
Site5
</code></pre>
<p>要稍微分解一下<code>print</code>语句,请执行以下操作:</p>
<ul>
<li><code>line.count('/')</code>是<code>/</code>个字符的数目</李>
<li><code>line.split('/')</code>将字符串拆分为一个列表,例如<code>['Parent', 'SiteF']</code></李>
<li>可以将字符串乘以整数。<code>' ' * 2 == ' '</code></李>
<li><code>[-1]</code>选择列表的最后一个元素</李>
<li>您可以将两个字符串与<code>+</code>一起添加<code>'foo' + 'bar' == 'foobar'</code></李>
</ul>
<p>(编辑)我在查看您的原始问题时注意到,您开始使用的输入实际上并没有单独包含<code>Parent</code>的条目,但您希望它出现在输出中。当然,只需抓取单个顶级根文件夹并将其添加到其中是很容易的,但是如果在树的任意深度的数据中存在其他漏洞呢?因此,我在添加一个集合理解时很开心,它将浏览路径列表,并通过从子文件夹中提取父文件夹的名称来“填充”任何丢失的父文件夹</p>
<pre><code>for path in sorted(list(
{
'/'.join(path.split('/')[:i])
for i in range(1, len(path.split('/')))
for path in info
} | set(info)
)):
print(' ' * path.count('/') + path.split('/')[-1])
</code></pre>
<p>玩得开心</p>