2013-11-10 2 views
0

Python. Он предоставляется список списка. Как сделать функцию, которая будет представлять данные из списка, как «морская строка», как будто каждая информация будет показана в новой строке, а перед ней столько «*», сколько глубина данных.Как распечатать данные из списка списка с рекурсией

Пример: у нас есть список [2, 4, [[3, 8], 1]] и теперь функция должна сделать и вернуть строку, которая функция «печать» печатает его так:

* 2 
* 4 
*** 3 
*** 8 
** 1 

Я сделал сейчас только это и ее не работает

def Function(List): 
    s='' 
    Count=0 
    for element in List: 
     Count+=1 
     if type(element)==type([]): 
      s+=Function(element) 

     else: 
      s+=Count*'*'+str(element)+('\n') 


    return s 

если заменить возврат (ы) с печатью (с) это сообщить мне об ошибке ... но если я вернуться с и чем я напечатать эту строку она работает нормально, но в очередной раз не так, как это должен

>>> Function([2, 4, [[3, 8], 1]]) 
'*2\n*4\n*3\n*8\n**1\n' 
>>> print('*2\n*4\n*3\n*8\n**1\n') 
*2 
*4 
*3 
*8 
**1 

Где проблема, я не могу ее найти. Что я должен заменить, удалить и т. Д.?

+2

Пожалуйста, не называйте вашу функцию 'Function', не называйте свой аргумент' list' и не используйте заглавные буквы для переменных ... –

ответ

1
def r(l, depth=0, ret=[]): 
    if isinstance(l,list): 
     for i in l: 
      r(i, depth+1) 
    else: 
     ret.append('*' * depth + str(l)) 
    return ret 

print '\n'.join(r([2, 4, [[3, 8], 1]])) 

выход:

*2 
*4 
***3 
***8 
**1 
+0

это то, что мне нужно: D, но я должен печатать строку в конце не каждый шаг, а только в конце – user2471076

+0

ответ обновляется соответствующим образом –

1

Для рекурсивных звонков необходимо передать count; локальные переменные не магически передать новые функции вызовов:

def format_nested(lst, depth=1): 
    s = [] 
    for element in lst: 
     if isinstance(element, list): 
      s.append(print_nested(element, depth + 1)) 
     else: 
      s.append('{0} {1}\n'.format(depth * '*', element)) 
    return ''.join(s) 

Я обращался в различные другие проблемы с кодом:

  • Используйте описательные функции и аргументов имена. Function - отличное имя.
  • Используйте список для создания элементов строки, затем используйте str.join(); это быстрее, чем наращивание строк путем конкатенации.
  • Только увеличивайте счетчик глубины при рекурсии, а не на каждый элемент текущего уровня списка.
  • Используйте isinstance() для проверки конкретных типов.
  • Форматирование строк упрощает сбор строк вместе с постоянными элементами, такими как пространство и символ новой строки.

Демо:

>>> format_nested([2, 4, [[3, 8], 1]]) 
'* 2\n* 4\n*** 3\n*** 8\n** 1\n' 
>>> print format_nested([2, 4, [[3, 8], 1]]) 
* 2 
* 4 
*** 3 
*** 8 
** 1 
+0

Вы это пробовали? У меня есть копия и вставка, и она не работает. Что-то не так с возвращением. – user2471076

+0

Да, я попробовал. См. Демонстрацию.Я исправил небольшую ошибку в начале цикла редактирования, попробуйте скопировать и вставить снова. –

+0

Я скопировал снова, и он прошел, но это вернуло меня: print_nested ([2, 4, [[3, 8], 1]]) Traceback (последний последний звонок): Файл «», строка 1, в print_nested ([2, 4, [[3, 8], 1]]) Файл «C: /Python30/b.py», строка 7, в print_nested s.append ('{} {} \ n '.format (depth *' * ', element)) ValueError: имя поля нулевой длины в формате – user2471076

0

Часто это проще выразить эти вещи в качестве генератора

L = [2, 4, [[3, 8], 1]] 

def nest_gen(L): 
    if isinstance(L, list): 
     for i in L: 
      for j in nest_gen(i): 
       yield "*"+str(j) 
    else: 
     yield L 

for row in nest_gen(L): 
    print(row) 

В Python3.3 + вы можете использовать yield from

L = [2, 4, [[3, 8], 1]] 

def nest_gen(L): 
    if isinstance(L, list): 
     yield from ("*"+str(j) for i in L for j in nest_gen(i)) 
    else: 
     yield L 

for row in nest_gen(L): 
    print(row) 

Вместо catenating строк снова и снова, вы можете дать глубину/элемент в виде кортежа

L = [2, 4, [[3, 8], 1]] 

def nest_gen(L): 
    if isinstance(L, list): 
     yield from ((j+1, k) for i in L for j, k in nest_gen(i)) 
    else: 
     yield 0, L 

for item in nest_gen(L): 
    print("{:*>{}} {}".format('', *item)) 
Смежные вопросы