Python 动态字符串格式化

4 投票
2 回答
2818 浏览
提问于 2025-04-18 07:20

我遇到了一种情况,直到我计算出另一个数字的长度之前,我并不确定我想怎么格式化某个字符串。

像这样做:

"{0:.2f}".format(#)

效果很好,因为我知道我想在小数点后显示多少位,这里是两位。如果位数可能会变化,那我该怎么做呢?我想把一个叫做B的列表中格式化好的元素放到一个字符串里,而这些元素是根据另一个叫做A的列表中的对应元素来格式化的。

A = ['1.100','5.4','11.1','7']
B = [1.23474927,4.92837087,12.06532387,6.9998123]

我理想中想看到的答案是这样的:

C = ['1.235','4.9','12.1','7']

到目前为止,我知道的有:

1) 我可以通过以下方式计算出A中每个字符串右边有多少位:

places_A = [len(A[i].partition('.')[2]) for i in range(len(A)]

真正的问题是:我该如何动态地告诉format()保持小数点右边那么多位呢?

2 个回答

3

使用传统的字符串格式化方法:

>>> d = 2
>>> f = "%%.%sf" % d
>>> f
'%.2f'
>>> f % 5.0
'5.00'

也就是说,首先动态地创建你的格式字符串,然后用这个格式字符串把你的浮点数转换成字符串。这个概念可以用现代的字符串格式化语法来实现。

10

你只需要更多的替换符号(其实就是更多的{}):

print "This is a number with {1} places {0:.{1}f}".format(3.14159, 2)

或者,在你给的例子中:

C = ['{0:.{1}f}'.format(b, len(a.partition('.')[2])) for a,b in zip(A,B)]

撰写回答