Python递归分割路径

7
我正在尝试将作为字符串给出的路径使用“/”作为分隔符进行递归拆分,并传递到元组中。例如:“E:/John/2012/practice/question11”应该是('E:','John','2012','practice','question11')。
所以我已经将除“/”之外的每个字符传递到了一个元组中,但这不是我想要的子部分连接方式,就像示例中显示的那样。这是一道作业中的练习问题,因为我正在尝试学习递归,所以希望得到帮助。
非常感谢。
2个回答

12

像这样的东西

>>> import os
>>> s = "E:/John/2012/practice/question11"
>>> os.path.split(s)
('E:/John/2012/practice', 'question11')

注意os.path.split()不能像str.split()那样将整个路径拆分。

>>> def rec_split(s):
...     rest, tail = os.path.split(s)
...     if rest == '':
...         return tail,
...     return rec_split(rest) + (tail,)
...
>>> rec_split(s)
('E:', 'John', '2012', 'practice', 'question11')

编辑:虽然问题是关于Windows路径的,但很容易对其进行修改以适用于Unix/Linux路径,包括以“/”开头的路径。

>>> def rec_split(s):
...     rest, tail = os.path.split(s)
...     if rest in ('', os.path.sep):
...         return tail,
...     return rec_split(rest) + (tail,)

2
这个解决方案更好,因为它与操作系统无关,并且不假设使用正斜杠还是反斜杠。 - DaveP
这在Linux中不起作用,因为“rest”最终变成“/”。不幸的是,我还没有足够的声望来投票反对它,因此发表了这个评论。 :(我现在正在使用以下代码:def rec_split(path): elements = [] while ((path != '/') and (path != '')): path, tail = os.path.split(path) elements.insert(0,tail) return elements - Axel Heider
1
@AxelHeider,没问题,如果你愿意的话,但它不是递归的,所以你可能想要更改名称 :) - John La Rooy
@John:你说得有道理。在某个时候,我改变了这个实现方式,因为递归似乎不是必要的——但从来没有费心去改名字…… - Axel Heider

1

你的错误不在于递归,而是在于你对递归结果进行连接的方式。比如说你已经到达了('E:', 'John', '2012', 'prac'),下一个字符是't';你不想将't'附加到递归结果上,而是想将其附加到递归结果中的最后一个单词上。同样地,当你到达分隔符时,你需要将新的单词初始化为空。

当你进行递归时,通常会有两种情况:递归和终止。终止情况通常很简单,而且你已经正确地处理了它(如果没有字符串,就没有单词)。但我发现,如果你尝试在计算过程中找到一个具体的递归案例,比如上面的中间计算,来确定需要发生什么,这会极大地帮助你。


你能给我一个例子吗?当递归地进行时,我不明白如何将其添加到最后一个单词。 - user1757703
我不想替你解决作业,你仍然应该自己去完成。但是你可以使用 path = last_path[:-1] + (last_path[-1] + s[0],) 将一个字母添加到元组的最后一个元素。 - Amadan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接