2013-06-04 2 views
0

Мне нужна функция печати, которая может печатать внутренний список.Как управлять форматом функции печати этого списка

Ожидаемый результат моей функции должно быть:

a 
b 
    aa 
    bb 
     aaa 
     bbb 

Однако теперь результат: (дополнительное пространство не ожидается)

a 
b 
     aa 
     bb 
      aaa 
      bbb 

Как я могу получить ожидаемый результат? Я старался изо всех сил, но не смог найти решение. Заранее благодарим за помощь.

testlist = ["a","b",["aa","bb",["aaa","bbb"]]] 

add_space = False 

def printList(the_list, level): 

    global add_space 

    for each_item in the_list: 
     if isinstance(each_item, list): 
      add_space = True 
      level += 1 
      printList(each_item, level) 
     else: 
      if add_space == True: 
       for numbers in range(level): 
        print("\t",end="") 
      print(each_item) 


printList(testlist,1) 
+0

Просто наблюдение: Ваши имена переменных '' each_item' и the_list' имеет смысл только при объявлении вашего для цикла. Внутри нее имена переменных странны: p я бы пошел с .... 'для элемента в списке' или что-то еще. – keyser

+0

Также обратите внимание, что после одного вызова вашего 'printList' с вложенным списком' add_space' всегда будет 'True', что может привести к неправильным результатам при следующих вызовах, если вы не сбросите его. – Bakuriu

+0

Вы пробовали 'print (" "* (level-1), end =" ")'? – hbprotoss

ответ

1

Глобальное состояние (переменная add_space) не является необходимым здесь, когда первый вызов делается перечень печати с уровнем 0 (например, printList (testlist, 0)). Это упрощает код и упрощает тестирование и отладки.

Когда вы добавляете оператор печати для уровня в свой код, вы также увидите, что уровень заканчивается как 2 для первого элемента списка.

И последняя небольшая ошибка: ваш код увеличивает переменную уровня, когда «each_item» является списком, но впоследствии не уменьшает его. Из-за этого отступ будет неправильным, если вы добавите новый элемент в конце списка, просто пройдя уровень + 1 к рекурсивному вызову исправлений PrintList, которые возникают.

Объединяя все это:

testlist = ["a","b",["aa","bb",["aaa","bbb"]]] 

def printList(the_list, level): 

    for each_item in the_list: 
     if isinstance(each_item, list): 
      printList(each_item, level + 1) 
     else: 
      for numbers in range(level): 
       print("\t",end="") 
      print(each_item) 


printList(testlist,0) 
+0

Спасибо Рональд, ты дал мне очень четкое объяснение проблемы. – Dennisboys

3

Использование рекурсивного метода.

testlist = ["a", "b", ["aa", "bb", ["aaa", "bbb"]]] 

def recursive_list_print(lst, level=0): 
    for item in lst: 
     if isinstance(item, list): 
      recursive_list_print(item, level+1) 
     else: 
      print('{}{}'.format('\t'*level, item)) 

recursive_list_print(testlist) 

Урожайность:

>>> 
a 
b 
    aa 
    bb 
     aaa 
     bbb 
+0

@Keyser Прочитайте документы о ['str.format'] (http://docs.python.org/3.3/library/stdtypes.html#str.format). – kirelagin

+0

@Keyser Что нужно объяснить? Я использую формат для объединения вкладок, необходимых для отступов строки и элемента для печати. Форматирование умножает символ табуляции на «уровень», который является уровнем отступа, который должна иметь строка ... –

+0

Каждый '{}' будет заменен элементом из списка форматов. Здесь первый '{}' станет '' \ t '* level', а второй '{}' станет 'item'. – ATOzTOA

0

Просто вызовите метод как

printList(testlist,0) 
Смежные вопросы