在python中打印不同的列宽

时间:2017-03-24 05:09:16

标签: python python-3.x pretty-print

我在这里使用python 3而不导入pandas,试图整洁地打印列表的输出。它必须具有不同的列宽。例如。列+2中单词的最大长度。到目前为止,我有一个整洁的输出,但所有行中的所有列都具有相同的间距。 spacing =单词的最大长度。

以下是我所拥有的: 该列表从csv读入并格式化为标记为列表的下列列表。

list = [['0', 'Name', 'at', 'Address', '11111', 'Pl'], ['1', 'Name', 'at', 'Address', '36', 'Crt'],['2', 'Name', 'at', 'Address', '5678', 'cl'],['3', 'Name', 'at', 'Address', '7', 'St'],['']]

col_width = max(len(word) for row in list for word in row) + 2   # padding of 2

for row in list :

     print "".join(word.ljust(col_width) for word in row)

输出:

0      Name      at      Address      11111      Pl
1      Name      at      Address      36         Crt
2      Name      at      Address      5678       cl
3      Name      at      Address      7          St

首选输出:

0. Name   at Address   11111 Pl
1. Name   at Address   36    Crt
2. Name   at Address   5678  cl
3. Name   at Address   7     St

我已将行更改为列,但仍然没有区别。我道歉但我在这里不理解什么? 谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

您目前正在使用数据中任何字词的最大长度,而不是给定列中的最大长度。您需要计算每列的最大宽度,然后使用它。

为了做到这一点,您可以将数据提供给itertools.zip_longest以逐列获取数据并存储每列的最大宽度。然后,当您输出数据时,只需将相应的宽度传递给BeanWithRuntimeDependencies bean = context.getBean(BeanWithRuntimeDependencies.class, context.getBean(DependencyA.class), context.getBean(DependencyB.class), "runtime string", 10);

ljust

输出:

from itertools import zip_longest

l = [['0', 'Name', 'at', 'Address', '11111', 'Pl'],
     ['1', 'Name', 'at', 'Address', '36', 'Crt'],
     ['2', 'Name', 'at', 'Address', '5678', 'cl'],
     ['3', 'Name', 'at', 'Address', '7', 'St'],['']]

widths = [max(len(s) for s in x) for x in zip_longest(*l, fillvalue='')]

for row in l :
    print("".join(word.ljust(w + 2) for word, w in zip(row, widths)))

更新:假设所有行都有相同数量的列,并且您希望使用不同的填充,则可以使用0 Name at Address 11111 Pl 1 Name at Address 36 Crt 2 Name at Address 5678 cl 3 Name at Address 7 St 并创建一个覆盖某些填充的zip列:

dict

输出:

DEFAULT = 2
l = [['0', 'Name', 'at', 'Address', '11111', 'Pl'],
     ['1', 'Name', 'at', 'Address', '36', 'Crt'],
     ['2', 'Name', 'at', 'Address', '5678', 'cl'],
     ['3', 'Name', 'at', 'Address', '7', 'St']]

padding = {2: 1}
widths = [max(len(s) for s in x) for x in zip(*l)]

for row in l :
    print("".join(word.ljust(w + padding.get(i, DEFAULT))
                  for i, (word, w) in enumerate(zip(row, widths))))