2016-04-27 157 views
0

我想用蟒蛇,尋找喜歡Python列表遞歸

[[['a'],'a'],'a'] 

所以,我寫了一個遞歸函數來得到它得到一個嵌套列表。

def recursion(x,i): 
    x.append(list('spam')) 
    x=[x] 
    i-=1 
    print('i value is %d'%i) 
    print(x) 
    if i>0: 
     print('start new recursion!') 
     recursion(x,i) 
    print('callback x"s value:',x) 
    #return x 

可是,如果我叫喜歡

x=[] 
recursion(x,4) 
此功能

x的結果是

[['s', 'p', 'a', 'm']] 

我不明白,我發現這個功能似乎有GET通過標準輸出x的正確值,

i value is 3 
[[['s', 'p', 'a', 'm']]] 
start new recursion! 
i value is 2 
[[[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']]] 
start new recursion! 
i value is 1 
[[[[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']]] 
start new recursion! 
i value is 0 
[[[[[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']],  ['s', 'p', 'a', 'm']]] 
callback x"s value: [[[[[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']]] 
callback x"s value: [[[[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']] 
callback x"s value: [[[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']] 
callback x"s value: [[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']] 

請告訴我x會發生什麼,以及爲什麼函數不會返回我想要的x的值。非常感謝,併爲我可憐的英語道歉。

感謝X我想要得到的所有attention.The值

[[[[[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']],  ['s', 'p', 'a', 'm']]] 

我很抱歉,我錯過了在第一篇文章。

+0

你的問題是不明確的,因爲你當你調用'recursion(x,4)'時不顯示x是什麼,並且你沒有爲這種情況指定期望的輸出 – wim

+0

你期望得到'[[[['s'],'p'] ,'a'],'m']或者:'[[[['s','p','a','m'],['s','p','a',' m'],['s','p','a','m'],['s','p', '''''']]' –

+0

首先感謝,我的錯誤是我沒有顯示我想要的結果。事實上,我想要的結果是'[[['s','p' ,'','m'],['s','p','a','m'],['s','p','a','m'],['s' ,'p','a','m']],再次感謝您的關注。 –

回答

1

我不知道要發生什麼事情,但這裏所發生的事情:

def recursion(x,i): 
    x.append(list('spam')) 
    x=[x] 

這裏,x變成[['s','p','a','m']]。但在此之後它不會改變。當您稍後幾行呼叫recursion(x,i)時,這不會影響x的原始值。

也許如果你做x = recursion(x,i),它會給你你想要的,因爲x實際上是在頂層的變化。

+0

非常感謝你,我讓我知道它爲什麼會發生。但是你必須錯過一些東西,我已經更新了我希望得到的x值的帖子。並且我嘗試用你的代碼來解決我的問題,我失敗了。我可以問爲工作代碼?再次感謝您。 –

2

我也不確定你想要發生什麼,但是如果你想將一個字符串分割成字符並把它們放入嵌套列表中,這個函數就可以工作。

def recursion(l,s): 
    if s == "": 
     return l; 
    elif len(l) == 0: 
     nL = [s[0]] 
     return recursion(nL,s[1:]) 
    else: 
     nL = [l,s[0]] 
     return recursion(nL,s[1:]) 

因此,例如

print recursion([],"spam") 

將輸出

[[[['s'], 'p'], 'a'], 'm'] 
0

我想你可能通過這樣的事實感到困惑的是一個Python string( 「垃圾郵件」 是一個字符串)在許多相當於Python的一種方式list。您可以爲它們編制索引,獲得它們的len()等。特別是,您在方括號中做的任何事情都適用於stringlist類型。

你的第一個例子是一個單字節字符串,[[['a'], 'a'], 'a']但你不給我們一些關鍵細節:你期望產生這個輸出的輸入是什麼?

例如,輸入可能是:

func('a', 3) 

或者可能是:

func('aaa') 

或者可能是:

func(['a'], 3) # or ,2) 

或者可能是:

func(['a', 'a', 'a']) 

任何這些將是返回值爲[[['a'], 'a'], 'a']的合理起點。

解決方案

因爲你的榜樣函數接受第二個參數,i,我要去假設有它的實際需要。所以,讓我們用最簡單可行的情況下:

def func(lst, times): 
    """ 
    Given a list and a multiplier > 0, return a "nested" list with 
    the contents of the original list repeated (nested) that many 
    times: 

     Input: [a,b],2 
     Output: [[a,b],a,b] 
    """ 
    assert times > 0 
    if times == 1: 
     return lst[:] 
    else: 
     result = lst[:] 
     result.insert(0, func(lst, times-1)) 
     return result 

    for times in range(1,4): 
     print(func(['a', 'b'], times)) 

備用

這裏有一個簡單的功能,即不承擔名單:

def func(content, times): 
    """ 
    Given content and a multiplier > 0, return a set of nested lists, 
    with the requested depth, each containing optionally any further 
    nested lists and the given content. 

     Input: 'content', 2 
     Output: [['content'], 'content'] 
    """ 
    assert(times > 0) 
    if times == 1: 
     result = [content] 
    else: 
     result = [func(content, times-1)] 
     result.append(content) 
    return result 

for times in range(1,4): 
    print(func('a', times))