web-dev-qa-db-ja.com

文字列をフォーマットするときに同じ値を複数回挿入する

この形式の文字列があります

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

String内のすべての%sは同じ値(つまりs)を持ちます。これを書くより良い方法はありますか? (sを3回リストするのではなく)

101
Goutham

高度な文字列フォーマット を使用できます。これは、Python 2.6およびPython 3.xで使用できます。

incoming = 'arbit'
result = '{0} hello world {0} hello world {0}'.format(incoming)
187
Adam Rosenfield
incoming = 'arbit'
result = '%(s)s hello world %(s)s hello world %(s)s' % {'s': incoming}

理解を深めるために、この記事を読むことをお勧めします: String Formatting Operations

39
mhawke

辞書タイプのフォーマットを使用できます。

s='arbit'
string='%(key)s hello world %(key)s hello world %(key)s' % {'key': s,}
14
Lucas S.

より良いという意味によって異なります。これは、目的が冗長性の除去である場合に機能します。

s='foo'
string='%s bar baz %s bar baz %s bar baz' % (3*(s,))
12
jjames
>>> s1 ='arbit'
>>> s2 = 'hello world '.join( [s]*3 )
>>> print s2
arbit hello world arbit hello world arbit
3
Whiterocker

Fstrings

Python 3.6+を使用している場合は、フォーマットされた文字列を表す新しいf-stringsという名前を使用できます。これは、文字列の先頭にfという文字を追加して、 f-string

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-stringsを使用する主な利点は、f-stringsが読みやすく、高速になり、パフォーマンスが向上することです。

ソースPandas for Everyone:Python Data Analysis、ダニエルY.チェン

ベンチマーク

文字列を再マッピングする必要がないため、新しい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のマッピングが実際に高速になります。

1
user1767754