web-dev-qa-db-ja.com

Python辞書と文字列を使用した文字列補間

与えられた:

dict = {"path": "/var/blah"}
curr = "1.1"
prev = "1.0"

文字列を補間して以下を生成するための最良/最短の方法は何ですか?

パス:/ var/blah curr:1.1 prev:1.0

私はこれがうまくいくことを知っています:

str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % {"path": dict["path"],"curr": curr, "prev": prev}

しかし、私は次のようなもっと短い方法があることを望んでいました:

str = "path: %(path)s curr: %s prev: %s" % (dict, curr, prev)

これが過度に衒学的な質問のように思われる場合は、お詫び申し上げます。

20
richid

何故なの:

mystr = "path: %s curr: %s prev: %s" % (mydict[path], curr, prev)

ところで、私はあなたがそのトランプルを使用していたいくつかの名前を組み込みの名前に変更しました-それをしないでください、それは決して必要ではなく、時々それが引き起こす不正行為(何かが使用している場所)を追跡するのに多くの時間を浪費しますビルトインを意味すると仮定したビルトイン名ですが、独自の変数の名前で非表示にしています)。

14
Alex Martelli

あなたはこれを試すことができます:

data = {"path": "/var/blah",
        "curr": "1.1",
        "prev": "1.0"}

s = "path: %(path)s curr: %(curr)s prev: %(prev)s" % data
49
Triptych

そしてもちろん、新しい(2.6から) 。format 文字列メソッドを使用することもできます:

>>> mydict = {"path": "/var/blah"}
>>> curr = "1.1"
>>> prev = "1.0"
>>>
>>> s = "path: {0} curr: {1} prev: {2}".format(mydict['path'], curr, prev)
>>> s
'path: /var/blah curr: 1.1 prev: 1.0'   

または、すべての要素が辞書にある場合は、次のようにすることができます。

>>> mydict = {"path": "/var/blah", "curr": 1.1, "prev": 1.0}
>>> "path: {path} curr: {curr} prev: {prev}".format(**mydict)
'path: /var/blah curr: 1.1 prev: 1.0'
>>>

str.format() ドキュメントから:

この文字列フォーマットの方法は、Python 3.0の新しい標準であり、新しいコードの 文字列フォーマット操作 で説明されている%フォーマットよりも優先されます。

23
monkut

多分:

path = dict['path']
str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % locals()

私はそれが機能することを意味します:

>>> dict = {"path": "/var/blah"}
>>> curr = "1.1"
>>> prev = "1.0"
>>> path = dict['path']
>>> str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % locals()
>>> str
'path: /var/blah curr: 1.1 prev: 1.0'

あなたがそれをもっと短く考えているかどうかはわかりません。

13
hughdbrown

また、(すぐに) f-strings in Python 3.6を使用することもできます。これは、おそらく文字列をフォーマットするための最短の方法です。

print(f'path: {path} curr: {curr} prev: {prev}')

そして、すべてのデータをdict内に配置することもできます。

d = {"path": path, "curr": curr, "prev": prev}
print(f'path: {d["path"]} curr: {d["curr"]} prev: {d["prev"]}')
3
gaborous

2016年の更新: Python 3.6 現在、変数を名前で文字列に置き換えることができます:

>>> Origin = "London"
>>> destination = "Paris"
>>> f"from {Origin} to {destination}"
'from London to Paris'

f"プレフィックスに注意してください。 Python 3.5以前でこれを試すと、SyntaxErrorが得られます。

https://docs.python.org/3.6/reference/lexical_analysis.html#f-strings を参照してください

2
Colonel Panic

データを辞書内に配置すると、次のことができます。

data = {"path": "/var/blah","curr": "1.1","prev": "1.0"}

"{0}: {path}, {1}: {curr}, {2}: {prev}".format(*data, **data)
2
Bemis

不変の変数を毎回辞書に追加したくない場合は、次の形式を使用して変数と辞書キーの両方を参照できます。

str = "path {path} curr: {curr} prev: {prev}".format(curr=curr, prev=prev, **dict)

論理的には悪い形式かもしれませんが、currとprevがほとんど静的であり、辞書が更新されることを期待して、物事をよりモジュール化しています。

1
Troy Fletcher