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

如何在python中对齐文本输出?,python,python-3.x,Python,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: ****** 11

所以我有一个函数,它根据程序中其他地方收集的数据创建一个小星表。当表格生成正确的输出时,由于每个数字中的字符数发生变化,它会取消表格的对齐。比如说,

70-78: *****
79-87: ***
88-96: ****
97-105: **
106-114: ******
115-123: ****
有没有办法让星星对齐(呵呵),这样输出是这样的:

70-78:   *****
79-87:   ***
88-96:   ****
97-105:  **
106-114: ******
115-123: ****
tabLength = charNum(lower[-1])+charNum(upper[-1])+3
下面是我当前打印表格的方式

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

这应该能奏效。我想有聪明的方法

print '70-78:'.ljust(10) + '*****'
您也可以使用
expandtabs()

简单的方法(在您的情况下)是放置一个选项卡而不是空格:

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])
lower=[70,79,88,97,106]
上限=[78,87,105,114,123]
num=[5,3,4,2,6,4]
对于拉链中的l、u、n(下、上、数字):

print({0:好的,虽然我使用的解决方案是公认的临时解决方案,但它确实有效,而且比目前为止的答案更具可伸缩性。基本上,它只是VR17建议的方法,但有一点更多,以便选项卡大小随数据集而伸缩,而不仅仅是硬编码

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

def charNum(number):
    return math.floor(math.log(number,10)+1)
然后我在我的
lower
upper
数据集的最后一个点上使用了
charNum()
函数。每个列表上只需使用最后一个点,因为最后一个点是最大的数字。然后我计算了非数字的字符(破折号、分号和空格),并进行了相应的调整。
最后一个tabLength变量如下所示:

70-78:   *****
79-87:   ***
88-96:   ****
97-105:  **
106-114: ******
115-123: ****
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: *

我能真正看到的唯一问题是,如果我想把它扩展到一个表或其他什么东西,标签会很时髦。如果我这样做了,我可能会研究
ljust
rjust
,我现在还不太熟悉。我会把这个问题留待一会儿,以防有人提出问题更好的答案。

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

或者,对于OP的示例:
print({0}-{1}:\t{2})。格式(下[x],上[x],“*”*num[x])。expandtabs(10))
旧字符串格式是在新字符串格式的大括号中嵌入变量值的唯一方法吗?不,您也可以在那里使用新样式格式,但随后您必须转义大括号,或者使用嵌套替换,我意识到这会更好,所以请参阅我答案中的编辑:)为了澄清,为什么必须将数字设置为等于自身?您可以在
.format()
函数的其他位置使用已定义的变量。是的,我选择的变量名并没有真正说明这一点(现在已更改)。在
numLength=digits
中,第一部分是命名参数名称;第二部分是命名参数的值。因此
digits=digits
会将函数的命名参数
digits
设置为变量
digits
@poke的值。我猜您的意思是最后一行的numLength=digits。