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


111

私はこの形のひもを持っています

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

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



2
この%文字列演算子は「Python 3.1で非推奨になり、後で削除される」docs.python.org/release/3.0.1/whatsnew/…さて、バージョンの互換性とセキュリティの両方に対して最も推奨される方法は何でしょうか。
cregox 2010

2
@Cawas私はこれがかなり遅いことを知っていますが、私はを使うのが好きstr.format()です。例:query = "SELECT * FROM {named_arg}"; query.format(**kwargs)、ここqueryで、はフォーマット文字列で、kwargsキーnamed_argはフォーマット文字列のsと一致する辞書です。
エドウィン

4
そう@Cawas、アダム以外タプル表記法、使用{0}{1}{2}などタプルインデックスに対応する上での01および2それぞれ。また、それは引数(のように名前を付けることも可能です{named_arg}。)などのように、formatメソッドで各1セット'Hi {fname} {lname}!'.format(fname='John', lname='Doe')
エドウィン

2
@bignose両方の質問にgoogle.com/…の
abhi

回答:



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

理解を深めるために、これを読んでください:文字列フォーマット操作


1
いいね。これについて忘れていました。locals()も同様です。
ゴーサム2009

2
@Goutham:Pythonのバージョンが最新の場合、Adam Rosenfieldの答えの方が良いかもしれません。
mhawke 2009

それは実際です。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 2009

3
mhawke:ブラウザがページをリロードする前にメッセージを投稿したので、その瞬間には質問がすでに回答されていることを知りませんでした。あなたは失礼な男である必要はありません!!。
ルーカスS.

2
@ルーカス:答えを入力するのに13分かかった可能性があると思います:)そして、反対票をありがとう...
mhawke 2009

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」の繰り返しではなく、重複のない実際のテンプレートであったと思います。それが私が反対票を投じた理由です。
Gra

1

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

すべての人のためのソースパンダ:ダニエルY.チェンによるPythonデータ分析

ベンチマーク

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マッピングの方が実際には高速であるようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.