在 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
我在这里使用 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