2012-01-05 2 views
2

Мне нужно напечатать несколько строк данных и сделать это хорошо. Я могу сделать это с помощью C++, изменяющих параметры std :: cout, но я не могу понять, как это сделать с Python. Например, у меня есть это:Печатная матрица Python

row1 = [1, 'arc1.tgz', 'First', '15.02.1992'] 
row2 = [16, 'arc2modified.tgz', 'Second', 'today'] 
row3 = ['112', 'arc89.tgz', 'Corrupted', 'unknown'] 

Я хочу напечатать текст, как это:

1 arc1.tgz   First  15.02.1992 
16 arc2modified.tgz Second  today 
112 arc89.tgz   Corrupted unknown 

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

Основная проблема заключается в том, что я могу использовать только модули Python по умолчанию. Есть ли возможность сделать это? Большое спасибо!

ответ

9
my_matrix = [row1, row2, row3] 
print "\n".join(["\t".join(map(str, r)) for r in my_matrix]) 

ETA: Мой первоначальный ответ пропустил, что вы хотите каждый столбец, чтобы быть фиксированной шириной, используя ватные пространства (а не вкладок). Также похоже, что вы хотите ровно два пробела между самыми длинными данными и следующим столбцом. В этом случае, это может быть сделано следующим образом (обратите внимание, что строка является встроенный модуль Python по умолчанию):

import string 

max_lens = [max([len(str(r[i])) for r in my_matrix]) 
       for i in range(len(my_matrix[0]))] 

print "\n".join(["".join([string.ljust(str(e), l + 2) 
       for e, l in zip(r, max_lens)]) for r in my_matrix]) 
+1

проблема возникает тогда, когда длина текста превышает интервал табуляции. Затем строка смещается относительно других. Решение сначала получает максимальную длину элемента в каждом столбце, а затем печатает соответственно – joaquin

+0

ах! ты сделал это ! upvoted !! – joaquin

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