在 python 中打印不同的列宽

print different column widths in python

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

这是我的资料: 该列表是从 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

我已将行更改为列,但仍然没有任何区别。我很抱歉,但我在这里不明白什么? 谢谢你的时间。

您当前使用的是数据中任何单词的最大长度,而不是给定列中的最大长度。您需要计算每列的最大宽度并改用它。

为此,您可以将数据提供给 itertools.zip_longest 以逐列获取数据并存储每列的最大宽度。然后,当您输出数据时,只需将相应的宽度传递给 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

Update:假设所有行都有相同数量的列,并且您希望有不同的填充,您可以使用 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))))

输出:

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