格式化字符串时多次插入相同的值


111

我有这种形式的字符串

s='arbit'
string='%s hello world %s hello world %s' %(s,s,s)

字符串中的所有%s都具有相同的值(即s)。有没有更好的书写方式?(而不是列出三遍)



2
docs.python.org/release/3.0.1/whatsnew/…%字符串运算符将“在Python 3.1上已弃用,并在以后的某个时间删除” 。
cregox

2
@Cawas我知道这已经很晚了,但是我喜欢使用str.format()。例如:query = "SELECT * FROM {named_arg}"; query.format(**kwargs),其中query是格式字符串,kwargs是具有与named_arg格式字符串中的s 匹配的键的字典。
埃德温

4
@Cawas是的,除了使用亚当元组符号,其中{0}{1}{2}等等对应于元组索引012分别。另外,也可以命名args(如{named_arg})并在format方法中设置每个参数,例如:'Hi {fname} {lname}!'.format(fname='John', lname='Doe')
Edwin 2012年

2
@bignose您已将两个问题都标记为彼此重复,例如google.com/…–
abhi

Answers:


203

您可以使用Python 2.6和Python 3.x中提供的高级字符串格式

incoming = 'arbit'
result = '{0} hello world {0} hello world {0}'.format(incoming)

11
〜我个人的喜好,喜欢result = '{st} hello world {st} hello world {st}'.format(st=incoming)
花哨的

40
incoming = 'arbit'
result = '%(s)s hello world %(s)s hello world %(s)s' % {'s': incoming}

您可能需要阅读以下内容以了解:String Formatting Operations


1
真好 忘记了这一点。locals()也可以。
哥谭2009年

2
@Goutham:如果您的Python版本是最新的,Adam Rosenfield的答案可能会更好。
mhawke

实际上是。Iam仍然习惯于新的字符串格式化操作。
哥谭2009年

3
甚至更好的是,您可以多使用以下基本字符串:'%(s)s hello world'* 3%{'s':'asdad'}
dalloliogm

15

您可以使用格式的字典类型:

s='arbit'
string='%(key)s hello world %(key)s hello world %(key)s' % {'key': s,}

1
提供这个重复的答案似乎没有多大意义。这是另一个:'%(string_goes_here)s hello world%(string_goes_here)s hello world%(string_goes_here)s'%{'string_goes_here':s,}。实际上有无限多种可能性。
mhawke

3
mhawke:我在浏览器重新加载页面之前发布了此消息,所以当时我不知道问题已经得到回答。您无需成为无礼的人!
Lucas S.

2
@卢卡斯:我想可能是您花了13分钟才能输入您的答案:),并感谢您的不赞成票...非常感谢。
mhawke

13

取决于您的意思更好。如果您的目标是消除冗余,则此方法有效。

s='foo'
string='%s bar baz %s bar baz %s bar baz' % (3*(s,))

3
>>> s1 ='arbit'
>>> s2 = 'hello world '.join( [s]*3 )
>>> print s2
arbit hello world arbit hello world arbit

我想问题中的示例不是关于“ hello world”的重复,而是一个没有重复的真实模板。这就是为什么我投反对票。
2013年

1

弦线

如果您正在使用Python 3.6+,则可以使用新的,f-strings它代表格式化的字符串,可以通过f在字符串的开头添加字符以将其标识为f字符串来使用它

price = 123
name = "Jerry"
print(f"{name}!!, {price} is much, isn't {price} a lot? {name}!")
>Jerry!!, 123 is much, isn't 123 a lot? Jerry!

使用f字符串的主要好处是它们更具可读性,可以更快,并且具有更好的性能:

每个人的熊猫资源:Python数据分析,作者Daniel Y. Chen

基准测试

毫无疑问,新f-strings方法更具可读性,因为您不必重新映射字符串,但是如前所述,它是否更快?

price = 123
name = "Jerry"

def new():
    x = f"{name}!!, {price} is much, isn't {price} a lot? {name}!"


def old():
    x = "{1}!!, {0} is much, isn't {0} a lot? {1}!".format(price, name)

import timeit
print(timeit.timeit('new()', setup='from __main__ import new', number=10**7))
print(timeit.timeit('old()', setup='from __main__ import old', number=10**7))
> 3.8741058271543776  #new
> 5.861819514350163   #old

运行1000万次测试似乎新f-strings的映射速度实际上更快。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.