Python - 如何将变量用作字符串格式化的一部分

10
我希望能够在下面的代码中使用int变量而不是数字(5)。如果可以的话,希望有方法实现,否则我将不得不将我的代码放在if块中,但我尽可能地想避免这样做(我不希望它在我的循环中每次都经过一次条件判断)。
my_array[1, 0] = '{0:.5f}'.format(a)

我是否可以使用变量来编写下面的代码,例如:

x = 5
my_array[1, 0] = '{0:.xf}'.format(a)

你想要的输出是什么? - Ajax1234
输出有些棘手,但没有问题。我的代码运行正常,问题在于如何在 {} 括号内使用变量。原因是当某个特定条件匹配时,我必须在 if/elif 语句中放置很多不同的行。我想避免这种情况,宁愿在此代码上面分配一个变量,而不必更改这里的行。我知道这听起来有些混乱,但我只是试图避免在循环中循环数百次的不需要的 if 语句。 - shafuq
我看到过但还没有学习过代码中的百分号符号,比如%x... 我怀疑它不是这样工作的,但也许有一种方法可以让我在.format()之前使用括号内的变量。 - shafuq
4个回答

19

当然有:

x = 5
a = '{1:.{0}f}'.format(x, 1.12345111)
print(a)  # -> 1.12345

如果您不想指定位置(01),您只需翻转输入即可:

a = '{:.{}f}'.format(1.12345111, x)
#                    ^ the float that is to be formatted goes first

那是因为format()方法的第一个参数对应字符串中最外层的第一个花括号

因此,以下代码会失败

a = '{:.{}f}'.format(x, 1.12345111) 

由于{:1.12345111f}无效。


你可能会发现有趣的其他格式示例:

a = '{:.{}{}}'.format(1.12345111, x, 'f')  # -> 1.12345

a = '{:.{}{}}'.format(1.12345111, x, '%')  # -> 112.34511%

a = '{:.{}}'.format(1.12345111, '{}{}'.format(x, 'f'))  # -> 112.34511%

最后,如果您正在使用Python3.6,请查看f-strings这个出色的答案,作者是@m_____z


你提供的代码非常好用!我想感谢你和其他成员对我的快速和有益的回复。只是想澄清一下,{0}代表x变量...它是它的位置。这部分我理解了。那么开头的1:呢?在这段代码中它代表什么?它在format函数中接受两个参数(x, 1.12345111)吗? - shafuq
01 均为传递给 .format() 的元组中的索引值。所以在这种情况下,0 指向 x,而 1 则指向 1.12345111。可以把它看作是执行 (x, 1.12345111)[0] - Ma0
我花了一些时间才理解最后一部分,现在我明白了。再次感谢! - shafuq
1
我认为最后一部分(@m_____z的回答)应该只在@m_____z的回答中。因为回答时间相同,你只是将他/她的回答添加到了你的回答中。 - vishes_shell
1
@vishes_shell,你说得完全正确,已经修改。 - Ma0

9
假设您正在使用Python 3.6,您可以简单地执行以下操作:
x = 5
my_array[1, 0] = f'{a:.{x}f}'

有点晚回复(抱歉),不过无论如何..我想尝试替代方法。你的例子是一个很好而且新的做法。它非常有效。谢谢! - shafuq

3

有两种方法可以实现这个目标。一种是使用str.format(),另一种是使用%。

其中,a表示你要打印的数字,x表示小数点后需要保留的位数:

使用str.format:

'{:.{dec_places}f}'.format(a, dec_places=x)

%:

'%.*f' % (x, a)

0
x=5
f='{0:.'+str(x)+'f}'
my_array[1, 0] = f.format(a)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接