我正在尝试制作一个程序,该程序将包含行列表并以网格形式打印出来。
我已经成功地将行列表转换为网格格式,但是我目前无法以特定方式对齐行。
我想出了一种算法,但是我不确定这是否是pythonic方法。
grid = [[21, 21, 21, 21, 21], [21, 42, 63, 84, 105], [21, 63, 126, 210, 315], [21, 84, 210, 420, 735], [21, 105, 315, 735, 1470]]
# grid[-1][-1]always the largest number in grid
# p is the number of digits of the largest number
p = len(str(grid[-1][-1]))
manipulated_grid = '\n'.join(' '.join(map(str, x)) for x in grid)
print(manipulated_grid)
# current output
21 21 21 21 21
21 42 63 84 105
21 63 126 210 315
21 84 210 420 735
21 105 315 735 1470
第一个目标是在第一行中分隔元素。我打算给
(p - 1) * ' ' for the spacing between the elements in the first row.
例如,由于最大的数字是1470及其数字4,因此我希望第一行的元素之间有3个空格。
我尝试使用正则表达式模块,但结果却失败了。我应该怎么办?
# current output
21 21 21 21 21
21 42 63 84 105
21 63 126 210 315
21 84 210 420 735
21 105 315 735 1470
# 1st objective
21 21 21 21 21
21 42 63 84 105
21 63 126 210 315
21 84 210 420 735
21 105 315 735 1470
第一行排成一行,现在我的第二个目标是将其他行中的所有元素右对齐到第一行。
# desired output
21 21 21 21 21
21 42 63 84 105
21 63 126 210 315
21 84 210 420 735
21 105 315 735 1470
我也一直在尝试使用rjust()函数,但是我不知道如何将该函数应用于我的案例。
答案 0 :(得分:2)
在python> = 3.6中,您可以执行以下操作:
for row in grid:
print(' '.join(f'{item:4d}' for item in row))
并且(如注释中所述),如果您使用的是较旧的python,则可以通过以下方式使用字符串格式设置:
for row in grid:
print(' '.join('{:4d}'.format(item) for item in row))
如果您不想逐行打印网格,则可以这样做:
grid_str = '\n'.join(' '.join(f'{item:4d}' for item in row) for row in grid)
print(grid_str)
'{:3d}'
将为您的整数保留3个字符并将它们右对齐。
有关python字符串格式的更多信息,请点击此处:https://pyformat.info/。
如果您不知道前面的宽度,可以执行以下操作:
width = len(str(max(n for row in grid for n in row)))
fmt = '{{:{}d}}'.format(width)
grid_str = '\n'.join(' '.join(fmt.format(item) for item in row) for row in grid)
print(grid_str)
有关更多选项,我还建议使用tabulate
(如您的帖子的第一条评论)。