2015-02-23 98 views
0

所以我想弄清楚這個問題,它要求我分割一個字符串並返回一個拆分字符串的元組,這應該是用遞歸完成的,絕對不使用循環。 這是我已經成功地想出功能:在python中用循環分割一個字符串

def split_path(s): 
    tup=[] 

    i=s.find("/") 
    if i!=-1: 
     tup.append(s[0:i]) 
     new_str=s[i+1:] 
     tup.append(split_path(new_str)) 


    else: 
     tup.append(s) 
    return tup 

「E:/ CP104/2005 /實驗室/ lab11t4」是我投入的函數的字符串,輸出應該是:

['E:', 'cp104','2005','labs','lab11t4'] 

,但是這是我有:

['E:', ['cp104', ['2005', ['labs', ['lab11t4']]]]] 

所以現在我成功地讓所有的字符串中,我需要的價值觀,我知道這個問題是我在回國一個元組,所以它是絕對的在一個元組中添加一個元組,所以我的外層元組中只有2個元素。

那麼,我如何實現內部元素的重新定義,以便我可以使最終的元組1維而不是5維的元素具有?

+1

python的可怕作業... – 2015-02-23 22:38:25

回答

3

現有的答案是正確的,因爲最小的修復對於給定的程序。但是,給定的程序並不是很好的遞歸形式。像這樣明確地在內存中建立結果是一種更迭代的習慣用法。

下面是可替代的形式,這是遞歸的風格有點更多:

def split_rec(path): 
    i = path.find('/') 
    if i == -1: 
     return (path,) 
    else: 
     return (path[:i],) + split_rec(path[i+1:]) 

這也返回了一個元組,如問題的文本,而不是一個列表,如代碼。要使其返回列表,請在出現時將(something,)替換爲[something]

+0

你的算法建立了一個延遲操作鏈,這是一個遞歸過程以及一個遞歸過程。其他人是迭代過程,但他們仍然是遞歸過程 – wwii 2015-02-24 00:27:57

2

更改appendextend當你做遞歸。既然你返回一個列表,你想擴展你有的當前列表,而不是追加另一個內部列表。

def split_path(s): 
    tup=[] 
    i=s.find("/") 
    if i!=-1: 
     tup.append(s[0:i]) 
     new_str=s[i+1:] 
     tup.extend(split_path(new_str)) 
    else: 
     tup.append(s) 
    return tup 

split_path("E:/cp104/2005/labs/lab11t4") 
['E:', 'cp104', '2005', 'labs', 'lab11t4'] 
0

可以使用extend代替append

tup.extend(split_path(new_str))