如何在python中对齐文本输出?

时间:2013-06-13 15:47:18

标签: python-3.x

所以我有一个功能,根据程序中其他地方收集的一些数据创建一个小星表。虽然表生成正确的输出,但由于每个数字中的字符数发生变化,因此表将取消对齐。例如,

70-78: *****
79-87: ***
88-96: ****
97-105: **
106-114: ******
115-123: ****

有没有办法让星星对齐(呵呵),这样输出就像这样:

70-78:   *****
79-87:   ***
88-96:   ****
97-105:  **
106-114: ******
115-123: ****

这是我目前如何打印表格。

for x in range(numClasses):
    print('{0}-{1}: {2}'.format(lower[x],upper[x],"*"*num[x]))

5 个答案:

答案 0 :(得分:11)

str.format已经可以指定对齐方式。你可以使用{0:>5}来做到这一点;这会将参数0与右边的5个字符对齐。然后,我们可以使用显示所有数字所需的最大位数来动态构建格式字符串:

>>> lower = [70, 79, 88, 97, 106, 115]
>>> upper = [78, 87, 96, 105, 114, 123]
>>> num = [5, 3, 4, 2, 6, 4]
>>> digits = len(str(max(lower + upper)))
>>> digits
3
>>> f = '{0:>%d}-{1:>%d}: {2}' % (digits, digits)
>>> f
'{0:>3}-{1:>3}: {2}'
>>> for i in range(len(num)):
        print(f.format(lower[i], upper[i], '*' * num[i]))

 70- 78: *****
 79- 87: ***
 88- 96: ****
 97-105: **
106-114: ******
115-123: ****

实际上,你甚至可以在这里使用带有嵌套字段的单一格式字符串:

>>> for i in range(len(num)):
        print('{0:>{numLength}}-{1:>{numLength}}: {2}'.format(lower[i], upper[i], '*' * num[i], numLength=digits))

答案 1 :(得分:5)

这应该可以解决问题。我认为有聪明的方法。

print '70-78:'.ljust(10) + '*****'

您也可以使用expandtabs()

print ('70-78'+'\t'+ '*****').expandtabs(10)

答案 2 :(得分:1)

lower = [70, 79, 88, 97, 106]
upper = [78, 87, 105, 114, 123]
num = [5, 3, 4, 2, 6, 4]

for l, u, n in zip(lower, upper, num):
    print('{0:<9} {1}'.format('{0}-{1}:'.format(l, u), '*' * n))

http://docs.python.org/3/library/string.html#format-specification-mini-language

答案 3 :(得分:1)

好的,虽然我正在使用的解决方案是公认的,但是它的工作方式,并且比目前为止的答案更好。基本上它只是VR17建议的方法,但稍微多一点,以便标签大小与数据集一致,并且不仅仅是硬编码。

首先,我创建了一个返回某个数字的数字字符的方法。

def charNum(number):
    return math.floor(math.log(number,10)+1)

然后我在charNum()lower数据集的最后一点使用了upper函数。只有最后一点必须在每个列表上使用,因为最后一点是最大的数字。然后我计算了不是数字的字符(破折号,分号和空格),并相应地进行了调整 所以最终的tabLength变量如下所示:

tabLength = charNum(lower[-1])+charNum(upper[-1])+3

然后我将tabLength变量插入expandTab()函数以获得适当的间距。这是一些示例输出:

1-11:  *******
12-22: *
23-33: ***
34-44: **
45-55: ***
56-66: *

99-249:   *****
250-400:  ****
401-551:  **
552-702:  **
703-853:  *
854-1004: ***

99-200079:      ******
200080-400060:  **
400061-600041:  ****
600042-800022:  **
800023-1000003: *

我能真正看到的唯一问题是,如果我想将它扩展到桌子或其他东西,那么标签就会变得很时髦。如果我这样做,我可能会调查ljustrjust,我现在并不是那么熟悉。如果有人想出更好的答案,我会暂时搁置这个问题。

答案 4 :(得分:0)

简单的方法(在你的情况下)是放置一个标签而不是空格:

for x in range(numClasses):
    print('{0}-{1}:\t{2}'.format(lower[x],upper[x],"*"*num[x]))

另一种方法是使用str.ljust

for x in range(numClasses):
    label = '{0}-{1}:'.format(lower[x], upper[x])
    print(label.ljust(10, ' ') + "*" * num[x])