2013-11-26 39 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列表的示例。 –