网格右对齐行

时间:2018-11-14 05:44:43

标签: python python-3.x

我正在尝试制作一个程序,该程序将包含行列表并以网格形式打印出来。

我已经成功地将行列表转换为网格格式,但是我目前无法以特定方式对齐行。

我想出了一种算法,但是我不确定这是否是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()函数,但是我不知道如何将该函数应用于我的案例。

1 个答案:

答案 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(如您的帖子的第一条评论)。