我们知道可以使用字符串中的一个 %s
格式化一个参数:
>>> "Hello %s" % "world"
'Hello world'
对于两个参数,我们可以使用两个%s
(duh!):
>>> "Hello %s, %s" % ("John", "Joe")
'Hello John, Joe'
那么,如何格式化可变数量的参数而不必在基本字符串中明确定义一些%s
等于格式的参数数量?如果这样的事情存在,那将是非常酷的:
>>> "Hello <cool_operator_here>" % ("John", "Joe", "Mary")
Hello JohnJoeMary
>>> "Hello <cool_operator_here>" % ("John", "Joe", "Mary", "Rick", "Sophie")
Hello JohnJoeMaryRickSophie
这是否可能,或者我唯一能做的就是做一些事情:
>>> my_args = ["John", "Joe", "Mary"]
>>> my_str = "Hello " + ("".join(["%s"] * len(my_args)))
>>> my_str % tuple(my_args)
"Hello JohnJoeMary"
注意:我需要使用%s
字符串格式化运算符执行此操作。
更新:
它需要与%s
一起使用,因为来自另一个库的函数使用该运算符格式化我的字符串,因为我传递了未格式化的字符串和args来格式化它,但是它会进行一些检查和更正(如果需要的话) )在实际进行格式化之前的args上。
所以我需要称之为:
>>> function_in_library("Hello <cool_operator_here>", ["John", "Joe", "Mary"])
"Hello JohnJoeMary"
感谢您的帮助!
答案 0 :(得分:23)
您在列表上使用str.join()
而不使用字符串格式,然后插入结果:
"Hello %s" % ', '.join(my_args)
演示:
>>> my_args = ["foo", "bar", "baz"]
>>> "Hello %s" % ', '.join(my_args)
'Hello foo, bar, baz'
如果你的某些参数还不是字符串,请使用列表推导:
>>> my_args = ["foo", "bar", 42]
>>> "Hello %s" % ', '.join([str(e) for e in my_args])
'Hello foo, bar, 42'
或使用map(str, ...)
:
>>> "Hello %s" % ', '.join(map(str, my_args))
'Hello foo, bar, 42'
你的功能也是如此:
function_in_library("Hello %s", ', '.join(my_args))
如果您受到(相当任意)限制的限制,您无法在插值参数列表中使用join
,请使用join
来创建格式字符串:
function_in_library("Hello %s" % ', '.join(['%s'] * len(my_args)), my_args)