Python中的字符串格式化

47

我想做类似于String.Format("[{0}, {1}, {2}]", 1, 2, 3) 的操作,返回结果应该是:

[1, 2, 3]

我该如何在Python中实现这个?


6
在Python 3.6及更高版本中,您可以使用f"[{1}, {2}, {3}]"来格式化字符串。 - Soorena
14个回答

76

之前的答案使用了%格式化,在Python 3.0+中已经被淘汰。假设你在使用Python 2.6+,这里描述了一种更加面向未来的格式化系统:

http://docs.python.org/library/string.html#formatstrings

虽然还有更高级的功能,但最简单的形式看起来与你写的非常相似:

>>> "[{0}, {1}, {2}]".format(1, 2, 3)
[1, 2, 3]

24
在 Python 3.1 中,不需要指定顺序。"[{}, {}, {}]".format(1, 2, 3)可以直接使用。 - Jason R. Coombs
10
Python 2.7 中的序数也是可选项。 - marshall.ward
你有参考文献证明在Python 3.0+中,%格式化正在逐步淘汰吗?它仍然存在于3.3版本中 - 参见http://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting - 虽然文档说更喜欢使用新的“format”方法,但并没有说明%运算符正在被淘汰。 - Day
2
根据Python 3.0的新特性文档(http://docs.python.org/release/3.0/whatsnew/3.0.html#pep-3101-a-new-approach-to-string-formatting): "仍然支持%运算符;它将在Python 3.1中被弃用,并在以后的某个时间从语言中删除。" 鉴于%的流行程度,也许这并不会真正发生,但至少要意识到这一点。 - DNS
百分比格式仍然存在,而从语言中删除它的意图似乎已被放弃。 - tripleee

32
你可以以三种方式完成它:

使用Python的自动美化打印:


print [1, 2, 3]   # Prints [1, 2, 3]

用一个变量展示相同的东西:

numberList = [1, 2]
numberList.append(3)
print numberList   # Prints [1, 2, 3]
使用“经典”字符串替换(即C语言的printf函数)。请注意,这里的%具有不同的含义:一个是字符串格式指示符,另一个是用于将列表(实际上是元组)应用于格式化字符串的占位符。(还要注意,%在算术表达式中被用作取模(求余)运算符。)
使用“经典”字符串替换(即C语言的printf函数)。请注意,这里的%具有不同的含义:一个是字符串格式指示符,另一个是用于将列表(实际上是元组)应用于格式化字符串的占位符。(还要注意,%在算术表达式中被用作取模(求余)运算符。)
print "[%i, %i, %i]" % (1, 2, 3)

请注意,如果我们使用预定义变量,我们需要将其转换为元组才能执行此操作:

print "[%i, %i, %i]" % tuple(numberList)
使用Python 3字符串格式化。这在早期版本(从2.6开始)仍然可用,但在Py 3中是“新”的做法。请注意,您可以使用位置(序数)参数或命名参数(为了好玩,我将它们倒序排列)。
print "[{0}, {1}, {2}]".format(1, 2, 3)

请注意,名称“one”,“two”和“three”可以是任何有意义的名称。

print "[{one}, {two}, {three}]".format(three=3, two=2, one=1)

5
为了完整起见,您也可以使用“传统”风格进行操作:print "[%(one)i, %(two)i, %(three)i]" % {'three':3,'two':2,'one':1} - DrAl

20

2
谢谢,最后一个百分号代表什么?另外,您是否需要像在C++中使用s、d、f等类型来指定打印方式? - Joan Venge
是的。整数 = %d,浮点数 = %f(还有精度,请查看参考文献)。 - Nick Stinemates

10

PEP 498是Python 3.6中新增的文本字符串插值方式,它基本上是format的缩写形式。

现在您可以这样做:

f"[{1}, {2}, {3}]"

我觉得常见的其他有用用途包括:

pi = 3.141592653589793
today = datetime(year=2018, month=2, day=3)

num_2 = 2     # Drop assigned values in
num_3 = "3"   # Call repr(), or it's shortened form !r
padding = 5   # Control prefix padding
precision = 3 #   and precision for printing


f"""[{1},
     {num_2},
     {num_3!r},
     {pi:{padding}.{precision}},
     {today:%B %d, %Y}]"""

这将生成:

"[1,\n     2,\n     '3',\n      3.14,\n     February 03, 2018]"

8

要按顺序打印元素,请使用{}而不需要指定索引。

print('[{},{},{}]'.format(1,2,3))

(适用于Python 2.7和Python 3.1及以上版本)


4

您的表述不太清晰,但我猜测您想要找的是:

foo = "Hello"
bar = "world"
baz = 2
print "%s, %s number %d" % (foo, bar, baz)

谢谢,最后一个百分号代表什么?另外,您是否需要像在C++中使用s、d、f等类型来指定打印方式? - Joan Venge
我会引用DNS上面更好的答案:https://dev59.com/M3RB5IYBdhLWcg3wxZ_Y#517471 - JosefAssad

4
我认为这个组合缺失了 :P
"[{0}, {1}, {2}]".format(*[1, 2, 3])

不解释 splat 的作用,这只是玄学。它适用于任何接受列表的东西。 - tripleee

3

2

非常简短的答案。

示例: print("{:05.2f}".format(2.5163)) 返回 02.51

  • {}在此设置变量
  • :开始样式
  • 0表示前导零,“ ”表示前导空格
  • 5 完整字符串长度(小数点计入,00.00的长度为5而不是4)
  • .2表示小数点后两位,四舍五入。
  • f表示浮点数

2

在回答这个问题之前,请阅读下面的几篇文章:

Python官方文档 here

有用的文章:

  • Python字符串格式化 - here

现在让我们回答这个问题

问题: 我想做这样的事情:

String.Format("[{0}, {1}, {2}]", 1, 2, 3) 返回:

[1, 2, 3]

我该如何在Python中实现这个功能?

回答:

好吧,这肯定是一个一行代码的答案,即

print("[{0},{1},{2}]".format(1, 2, 3))

当您执行此一行代码时,将打印包含三个值的列表,如[1, 2, 3]。我希望这很简单明了。

谢谢

Tanu


回答的重点在于您在本站上的内容。这应该是首要关注的。不建议阅读文章。当然,您可以将其链接到回答中,但最好放在回答的结尾或(如果多个问题都得到了解释)放在它所属的位置。 - RobertS supports Monica Cellio

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