2013-11-26 36 views
-3

如何更改我的代碼以在更改後返回LLL?遞歸和工廠問題

我有一個列表:

LLL = [12,[3,[5],[6,[[7, [],8], []]]], [8, [0,87,23,434,444,33]]] 

,我調用這個函數:

def testQ1(): 
dolist_deep_add1 = factory_dolist_deep_A((lambda x: x + 1)) 
print ('dolist_deep_add1(LLL) : ', dolist_deep_add1(LLL)) 

這個功能應該更改後返回列表。 結果林瓦亭爲:

LLL = [13,[4,[6],[7,[[8, [],9], []]]], [9, [1,88,24,435,445,34]]] 

factory_dolist_deep_A代碼:

def factory_dolist_wide_A(fa): 
def print_wide (L): 

    def pw1(x): 
     if type(x) is int: 
     x = fa(x) 
     print(str(x)+' ', end='') 

    def pwstart (L, lvl): 
     print('\nlevel ' + str(lvl) + " : " , end='') 
     pw  (L, lvl) 

    def pw (L, lvl): 
     if not L: return 
     Q = [] 
     for a in L: 
      if type(a) is list: 
       if a == [] : pw1('[]') 
       else: Q.extend(a) 
      else: 
       pw1(a) 
     pwstart(Q , lvl + 1) 

    return pwstart(L, 0) 
return print_wide 

現在它只是得到的數字,並打印出來,而不改變列表本身。

我想更改factory_dolist_wide_A(fa):以便它將返回一個更改的列表。

它應該像這個打印功能一樣工作,而不僅僅是打印更改,還可以對列表本身進行更改。

+1

你的問題很不清楚。 「改變後返回L」是什麼意思? – mgilson

+0

我的意思是,這裏它只是打印,我想返回更改列表,而不僅僅是打印更改... –

+0

這很清楚他想要什麼。當前打印列表的函數使用傳入的函數進行更改。他希望這些函數也返回已更改的列表。 –

回答

0

你的代碼有很多不必要的函數定義。 print_wide(L)定義爲pwstart(L, 0),而pwstart(L, lvl)定義爲pw(L,lvl)

我將所有這些定義合併爲print_wide。我也將pw1()更改爲modify()

此外,您現有的代碼有一個嚴重的錯誤。由於Q.extend(a)絕對沒有任何意義,我刪除它。

因此,下面的代碼遍歷整個數組,並且產生的結果是您要求的,但它不打印您的原始代碼將打印的內容。

def factory_dolist_wide_A(fa): 
    def print_wide (L, lvl=0): 
     def modify(x): 
      if type(x) is int: 
       x = fa(x) 
       print(str(x) + ' ', end='') 
      else: 
       print('[] ', end='') 
      return x 

     print('\nlevel ' + str(lvl) + " : " , end='') 

     newList = [] 
     for a in L: 
      if type(a) is list: 
       newList.append(print_wide(a, lvl+1)) 
      else: 
       newList.append(modify(a)) 
     return newList 
    return print_wide 

LLL = [12,[3,[5],[6,[[7, [],8], []]]], [8, [0,87,23,434,444,33]]] 

def testQ1(): 
    dolist_deep_add1 = factory_dolist_wide_A((lambda x: x + 1)) 
    x = dolist_deep_add1(LLL) 
    print() 
    print('dolist_deep_add1(LLL) : ', x) 

testQ1() 
+0

謝謝你的麻煩答案!,幫助我很多,但仍然被要求不要做一個新的名單,但改變名單給出。 –

+0

如何用'a = [1,2,3]''這樣的簡單數組來做到這一點? –

+0

如果你不知道如何改變一個像'a = [1,2,3]'這樣的列表,那麼你首先需要學習Python的基礎知識。您可以閱讀基本的Python3教程,並嘗試使用示例**,直到您理解它們。您還可以搜索人們更改Python列表的示例。 –