Python中布尔值如何在字符串中格式化?

194

我发现我不能做:

"%b %b" % (True, False)

在Python中,我猜测%b 代表布尔值。是否有类似的用法?


1
你想要什么结果?是True和False吗?那你需要'%s'。当存在时,%b用于二进制(即基数为2)。 - Thomas Wouters
2
哦耶!“%s”看起来运行得很好。回答这个问题并获得一个精选答案。我曾经使用“%s”%str(False)。我真是太丢人了 :) - Juanjo Conti
3
好的,我会尽力为您进行翻译。以下是需要翻译的内容:link to relevant documentation: http://docs.python.org/library/stdtypes.html#string-formatting-operations - mechanical_meat
6个回答

278
>>> print "%r, %r" % (True, False)
True, False

这不仅适用于布尔值 - %r 调用参数的 __repr__ 方法。 %s(用于字符串)也应该起作用。


3
%rе’Ң%sзҡ„дё»иҰҒеҢәеҲ«жҳҜд»Җд№Ҳпјҹ - Alston
25
我一直心里明白这个区别,但如果我错了,请纠正我。%s(因此str())旨在尽可能透明地表示对象供人类使用。 %r(因此repr())旨在尽可能透明地表示对象供Python使用。例如,print(str("foo"))仅在新行上打印foo。然而,print(repr("foo"))会打印一个新的带引号的字符串'foo',因为这就是你在Python解释器中键入以获得相应的对象参数的方式。 - bobismijnnaam

81

如果你想要 真 假 ,请使用:

"%s %s" % (True, False)

因为str(True)的结果是'True',而str(False)的结果是'False'

如果你想要1 0,可以使用:

"%i %i" % (True, False)

因为 int(True) 的结果是 1,而 int(False) 的结果是 0


21

您也可以使用字符串的Formatter类

print "{0} {1}".format(True, False);
print "{0:} {1:}".format(True, False);
print "{0:d} {1:d}".format(True, False);
print "{0:f} {1:f}".format(True, False);
print "{0:e} {1:e}".format(True, False);

这些是结果

True False
True False
1 0
1.000000 0.000000
1.000000e+00 0.000000e+00

一些%格式类型说明符(%r%i)不可用。有关详细信息,请参见格式规范微语言


4
请注意,添加格式选项可能会搞乱这个。例如,{ :_^5}将得到'__1__',除非您对布尔值进行str(...)处理。 - Michael
2
你可以通过像 !s 这样的类型转换来解决问题:'{!s:_^5}'.format(True) 将得到 'True_' - Michael

7
要将此更新为Python-3,您可以执行以下操作:
"{} {}".format(True, False)

然而,如果您想实际格式化字符串(例如添加空格),您会遇到Python将布尔值转换为底层的C值(即int)的情况,例如:

>>> "{:<8} {}".format(True, False)
'1        False'

为了解决这个问题,您可以将True转换为字符串形式,例如:
>>> "{:<8} {}".format(str(True), False)
'True     False'

1

扩展 phd 的回答,您可以在format()调用中不使用str()将布尔值转换为字符串。有一些奇怪的技巧可以利用新风格的字符串插值格式化布尔值。这也适用于 f-strings。

平凡无奇的情况

'{},{}'.format(True, False)  # 'True,False'
f'{True},{False}'            # 'True,False'

添加一些格式会将布尔值转换为整数

任何填充长度都会导致这种情况。我不确定为什么有人希望它以这种方式工作。

'{:0},{:0}'.format(True, False)  # '1,0'
f'{True:0},{False:0}'            # '1,0'

'{:>5},{:>5}'.format(True, False)  # '    1,    0'
f'{True:>5},{False:>5}'            # '    1,    0'

字符串强制转换可以恢复正常文本

注意其中的!s。这是与%s最直接的等效方式。还有!r代表__repr__()!a代表ASCII,但对于布尔值来说它们并不特别有趣。

'{!s:>5},{!s:>5}'.format(True, False)  # ' True,False'
f'{True!s:>5},{False!s:>5}'            # ' True,False'

0

关于Python字符串插值

在Python 3.6中,使用新的字符串字面量f前缀添加了字符串插值功能。

shouldBeTrue = True
print(f"shouldBeTrue={shouldBeTrue}")

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