Python разбивает путь рекурсивно
Я пытаюсь разделить путь, заданный в виде строки, на части, используя " / " в качестве разделителя рекурсивно и передать в кортеж. Например: "E:/John/2012/practice/question11" должно быть ('E:', 'John', '2012', 'practice', 'question11').
Таким образом, я передал каждый символ, исключая"/", в кортеж, но это не так, как я хотел, чтобы соединение частей, как показано в Примере. Это практический вопрос в домашнем задании и был бы признателен за помощь, поскольку я пытаюсь учиться рекурсия.
Большое спасибо
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'
к рекурсивному результату, вы хотите добавить его к последнему слову рекурсивного результата. Аналогично, когда вы достигнете разделителя, вы хотите инициализировать новое слово как пустое.Когда вы делаете рекурсию, у вас (в значительной степени) всегда будет два случая: рекурсивный и терминал один. Терминальная обычно проста, и вы сделали это правильно (если нет строки, нет и слов). Но я нахожу, что это очень помогает, если вы пытаетесь иметь конкретный пример рекурсивного случая, где-то в середине вычисления, как выше, чтобы точно определить, что должно произойти.