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

igetnqfo  于 2023-01-12  发布在  Python
关注(0)|答案(5)|浏览(114)

我有一个函数,它根据程序中其他地方收集的数据创建一个小的星星表。虽然该表产生正确的输出,但由于每个数字中的字符数发生变化,它会使表不对齐。例如,

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]))
nwsw7zdq

nwsw7zdq1#

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))
ftf50wuq

ftf50wuq2#

这个应该可以了我想肯定有聪明的办法。

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

您还可以使用expandtabs()

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

f2uvfpb93#

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

roejwanj

roejwanj4#

好吧,虽然我使用的解决方案是无可否认的ad-hoc,但它工作正常,比目前的答案更好地扩展。基本上它只是VR 17建议的方法,但多了一点,以便标签大小随数据集扩展,而不仅仅是硬编码。
首先,我创建了一个方法,返回某个数字中的数字字符。

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

然后,我对lowerupper数据集的最后一个点使用charNum()函数,每个列表只需要使用最后一个点,因为最后一个点是最大的数字,然后我计算非数字字符(破折号、分号和空格),并进行相应的调整。
因此,最后一个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,我现在还不太熟悉。我会把这个问题留一小会儿,以防有人提出更好的答案。

iyfamqjs

iyfamqjs5#

简单的方法(在您的情况下)是用制表符代替空格:

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])

相关问题