7

我正在尝试使用“/”作为分隔符递归地将作为字符串给出的路径拆分为子部分并传递给元组。例如:“E:/John/2012/practice/question11”应该是('E:', 'John', '2012', 'practice', 'question11')。

因此,我已将除“/”之外的每个字符都传递到一个元组中,但这不是我想要的示例中显示的子部件连接方式。这是家庭作业中的一个练习题,在我尝试学习递归时将不胜感激。

太感谢了

4

2 回答 2

11

像这样的东西

>>> 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,)
于 2012-11-22T04:36:35.847 回答
1

您的错误不是递归,而是您正在做什么来连接递归结果。说你已经到达('E:', 'John', '2012', 'prac'),下一个字符是't';您不想附加't'到递归结果,而是想将其附加到递归结果的最后一个单词。同样,当您到达分隔符时,您希望将新单词初始化为空。

当您进行递归时,您将(几乎)总是有两种情况:一种是递归的,一种是终端的。终端通常很简单,而且你做得对(如果没有字符串,就没有单词)。但是我发现,如果您尝试在上述中间计算的某个地方找到递归案例的特定示例,以准确计算出需要发生的事情,这将非常有帮助。

于 2012-11-22T04:19:57.410 回答