在Python中将列表打印为固定宽度字符串

1 投票
5 回答
2291 浏览
提问于 2025-04-27 21:50

有了下面这个列表:

In [3]: entr = [ 'ATOM', '1', 'P', 'C', 'B', '3', '42.564', '-34.232', '-7.330', '1.00', '105.08', 'P' ]

我想用 % 来创建一个固定宽度的字符串,但为什么这样做失败了呢?这两行都有12个条目。

In [4]: buf = "%-6s%5d  %-4s%3s %1s%4d    %8.3f%8.3f%8.3f%6.2f%6.2f          %2s\n" % entr
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-6c71c289664e> in <module>()
----> 1 buf = "%-6s%5d  %-4s%3s %1s%4d    %8.3f%8.3f%8.3f%6.2f%6.2f          %2s\n" % entr

TypeError: not enough arguments for format string
暂无标签

5 个回答

1

使用 .format 操作符,你可以这样做:

entr = [ 'ATOM', '1', 'P', 'C', 'B', '3', '42.564', '-34.232', '-7.330', '1.00', '105.08', 'P' ]

print(['{0: <6}'.format(str(x)) for x in entr])
['ATOM  ', '1     ', 'P     ', 'C     ', 'B     ', '3     ', '42.564', '-34.232', '-7.330', '1.00  ', '105.08', 'P     ']

1

你的数据集里的所有字段都是字符串,所以里面不能用数字格式。你需要把它们转换成数字类型。另外,如果想用百分比格式,参数必须是一个元组,而不是列表。

entr = ('ATOM', 1, 'P', 'C', 'B', 3, 42.564, -34.232, -7.330, 1.00, 105.08, 'P')
1

1) %这个符号是用来处理一个叫做tuple的东西,但你给的是一个list,这就不对了。

2) 你列表里的所有东西都是字符串,而在你的格式中,你用了小数和浮点数的标记。你应该把列表里的东西转换成正确的类型。

1

好的,我觉得你可以用这个:

entr = [ 'ATOM', '1', 'P', 'C', 'B', '3', '42.564', '-34.232', '-7.330', '1.00', '105.08', 'P' ]
buf = "{}-6s{}5d  {}-4s{}3s {}1s{}4d    {}8.3f{}8.3f{}8.3f{}6.2f{}6.2f          {}2s\n".format(*entr)
print buf

这样可以吗?

1

首先,你需要给格式化操作符 % 提供一个 tuple(元组)。

"..." % tuple(entr)

其次,对于数字,你应该使用 %d,而不是字符串!所以,你需要把这些变量转换成 number(数字)。下面是一个简单的例子:

"...%s ... %d ... %f " %(entr[1], float(entr[2]), float(entr))

撰写回答