2012-11-22 172 views
5

我試圖分割一個字符串作爲分割部分使用「/」作爲分隔符並傳遞到一個元組。例如:「E:/ John/2012/practice/question11」應該是('E:','John','2012','practice','question11')。Python分割路徑遞歸地

所以我已經把除了「/」以外的每個字符都傳遞給了一個元組,但它並不是我想要的例子中顯示的子部分聯合。這是作業中的一個練習問題,並且希望能夠幫助我學習遞歸。

謝謝你這麼多

回答

10

像這樣的事情

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

+0

這對於以'/'開頭的路徑不起作用。 – asmeurer

+0

這在Linux中不起作用,因爲「休息」最終會變成「/」。不幸的是,我還沒有足夠的聲望來投票,因此這個評論。 :( 我使用這個現: ' DEF rec_split(路徑): 元素= [] 而((路徑= '/')和(路徑= '')!): 路徑,尾= os.path.split(path) elements.insert(0,tail) 返回元素 ' –

2

你的錯誤是不是在遞歸,而是你在做串聯遞歸的結果是什麼。假設您已達到('E:', 'John', '2012', 'prac'),並且下一個字符是't';您不希望將't'附加到遞歸結果中,您希望將其附加到遞歸結果的最後。同樣,當您到達分隔符時,您想要將新單詞初始化爲空。

當你進行遞歸時,你將(幾乎)總是有兩種情況:一種是遞歸式的,另一種是終端式的。終端之一通常很容易,而且你做得很對(如果沒有字符串,就沒有字)。但是我發現如果你有一個遞歸的例子,在上面的中間計算的某個特定的例子中,可以非常有效地找出需要發生的事情。

+0

你能舉個例子嗎?我不明白你如何遞歸地將它添加到最後的單詞。 – user1757703

+0

我不想爲你解決功課,你仍然應該爲它工作。但是你可以用'path = last_path [: - 1] +(last_path [-1] + s [0],)''將一個字母追加到元組的最後一個元素。 – Amadan