2013-11-26 3 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)) 

Эта функция должна возвращать список после изменения. Результат Im поклонников:

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

Смежные вопросы