如何在Python中居中格式化的整数行?

1 投票
2 回答
1686 浏览
提问于 2025-04-17 07:57

我刚接触Python,之前玩过VB.NET、C语言和一些其他语言,所以发现以前的做法不一定适用于Python。在这种情况下,我想把一系列整数值打印成列,并尽量用少量代码让它们居中。

用普通字符串来做这件事很简单,比如:

print "%s|%s|%s|%s"   \
      % (s1.center(w), s2.center(x), s3.center(y), s4.center(z))

这里的 wz 是一些整数值,用来指定字符串 s1s4 应该居中的宽度。


但是当我想用格式说明符,比如 %0.2x%4d 来处理数字时,就不行了,因为整数没有 center 这个功能。

如果用更像C语言的方式,我可以单独转换每个整数:

s1 = str("%0.4x" % (i)).center(w)
s2 = str("%0.2x" % (i)).center(x)
s3 = str("%0.2x" % (i)).center(y)
s4 = str("%0.8x" % (i)).center(z)
print "%s|%s|%s|%s" % (s1, s2, s3, s4)


但这样做似乎不太符合“Python风格”,如果我理解得没错的话。那么,有什么好的“Python风格”的方法来做到这一点呢?需要能够在Python 2.4和2.7中都能用(我在这两个环境中工作)。

谢谢!

2 个回答

1

你可以强调每个值都是以相同的方式进行格式化的:

def as_output_field(value, width):
    return ('%0.4d' % value).center(width)

而且你可以通过数据驱动的方式来处理宽度和数值:

values = [s1,s2,s3,s4]
widths = [w,x,y,z]

你还可以强调你的格式由一堆相似的字段组成,这些字段之间用一个共同的字符分隔:

print '|'.join(as_output_field(value, width) for value, width in zip(values, widths))
1
ints = [1, 2, 3, 4]
widths = [(4, w), (2, x), (2, y), (8, z)]
for i in ints:
    print "%s|%s|%s|%s" % tuple(((("%0." + str(padding) + "d") % (i)).center(width)) for padding, width in widths)

widths这个列表里,每个元组都是一个包含两个部分的东西,分别是(填充,宽度)。这里的填充是用来格式化字符串的,比如用"%0.[padding]d"这样的方式来显示数字。

撰写回答