2015-09-26 2 views
-1

Допустим, у меня есть следующий список:Python: печать со знанием текущего уровня отступа

xl = [[[0,0], [-1,1], [-2,2]], [[-3,3], [-4, 4], [-5,5]] 

Я хочу напечатать и сохранить иерархию:

for el in xl: 
    print el 
    for iel in el: 
     print ' '*4 + str(iel) 
     for iiel in iel: 
      print ' '*8 + str(iiel) 

>>> 
[[0, 0], [-1, 1], [-2, 2]] 
    [0, 0] 
     0 
     0 
    [-1, 1] 
     -1 
     1 
    [-2, 2] 
     -2 
     2 
[[-3, 3], [-4, 4], [-5, 5]] 
    [-3, 3] 
     -3 
     3 
    [-4, 4] 
     -4 
     4 
    [-5, 5] 
     -5 

Иерархия может быть любой глубины

Мне нужен некоторый питонический способ печати с сохранением текущего уровня итерации (чтобы не справляться с отступом вручную).

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

+0

Вы говорите о 'enumerate'? https://docs.python.org/2/library/functions.html#enumerate –

+0

В вашем сложном случае вы говорите об элементе lxml? –

+0

Если вы действительно хотите напечатать элемент lxml, вам может не понадобиться вручную его кодировать, вы должны попробовать что-то вроде: 'print (etree.tostring (root, pretty_print = True))'. –

ответ

1
def indent(thing, current_indentation=""): 
    print current_indentation + str(thing) 
    try: 
     for item in thing: 
      indent(item, " " * 4 + current_indentation) 
    except TypeError: # thing is not iterable 
     pass 

xl = [[[0,0], [-1,1], [-2,2]], [[-3,3], [-4, 4], [-5,5]]] 
indent(xl) 

Выход:

[[[0, 0], [-1, 1], [-2, 2]], [[-3, 3], [-4, 4], [-5, 5]]] 
    [[0, 0], [-1, 1], [-2, 2]] 
     [0, 0] 
      0 
      0 
     [-1, 1] 
      -1 
      1 
     [-2, 2] 
      -2 
      2 
    [[-3, 3], [-4, 4], [-5, 5]] 
     [-3, 3] 
      -3 
      3 
     [-4, 4] 
      -4 
      4 
     [-5, 5] 
      -5 
      5 

Дело в том, что если вы хотите, чтобы написать код для обработки произвольно вложенных циклов вам нужно рекурсии.

+0

Спасибо за вашу идею. –

1

Я использую функцию «isinstance», чтобы определить тип дата ввода является ли список

def print_by_hierarchy(data,indentation): 
    if isinstance(data,list): 
     space = 2*indentation 
     for sub_data in data: 
      print(' '*space + str(sub_data)) 
      print_by_hierarchy(sub_data,indentation +1) 
    else: 
     return 

test_data = [[[0,0], [-1,1], [-2,2]], [[-3,3], [-4, 4], [-5,5]]] 
print_by_hierarchy(test_data,0) 


output: 
[[0, 0], [-1, 1], [-2, 2]] 
    [0, 0] 
    0 
    0 
    [-1, 1] 
    -1 
    1 
    [-2, 2] 
    -2 
    2 
[[-3, 3], [-4, 4], [-5, 5]] 
    [-3, 3] 
    -3 
    3 
    [-4, 4] 
    -4 
    4 
    [-5, 5] 
    -5 
    5 
Смежные вопросы