Python разбивает путь рекурсивно


Я пытаюсь разделить путь, заданный в виде строки, на части, используя " / " в качестве разделителя рекурсивно и передать в кортеж. Например: "E:/John/2012/practice/question11" должно быть ('E:', 'John', '2012', 'practice', 'question11').

Таким образом, я передал каждый символ, исключая"/", в кортеж, но это не так, как я хотел, чтобы соединение частей, как показано в Примере. Это практический вопрос в домашнем задании и был бы признателен за помощь, поскольку я пытаюсь учиться рекурсия.

Большое спасибо

2 6

2 ответа:

Что-то вроде этого

>>> 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')

Edit: хотя вопрос был о путях 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,)

Ваша ошибка заключается не в рекурсии, а в том, что вы делаете для объединения рекурсивных результатов. Допустим, вы достигли ('E:', 'John', '2012', 'prac'), и следующий символ - 't'; вы не хотите добавлять 't' к рекурсивному результату, вы хотите добавить его к последнему слову рекурсивного результата. Аналогично, когда вы достигнете разделителя, вы хотите инициализировать новое слово как пустое.

Когда вы делаете рекурсию, у вас (в значительной степени) всегда будет два случая: рекурсивный и терминал один. Терминальная обычно проста, и вы сделали это правильно (если нет строки, нет и слов). Но я нахожу, что это очень помогает, если вы пытаетесь иметь конкретный пример рекурсивного случая, где-то в середине вычисления, как выше, чтобы точно определить, что должно произойти.