web-dev-qa-db-ja.com

Pythonパーセント記号を使用した文字列の書式設定

私は正確に次のことをしようとしています:

>>> x = (1,2)
>>> y = 'hello'
>>> '%d,%d,%s' % (x[0], x[1], y)
'1,2,hello'

ただし、xが2つ以上ある長いので、試しました:

>>> '%d,%d,%s' % (*x, y)

しかし、それは構文エラーです。最初の例のようにインデックスを作成せずにこれを行う適切な方法は何でしょうか?

17
Sait

str % ..は、右オペランドとしてタプルを受け入れるため、次のことができます。

>>> x = (1, 2)
>>> y = 'hello'
>>> '%d,%d,%s' % (x + (y,))  # Building a Tuple of `(1, 2, 'hello')`
'1,2,hello'

あなたの試みはPython 3.で動作するはずです。ここで Additional Unpacking Generalizations はサポートされていますが、Python 2.x:ではサポートされていません。

>>> '%d,%d,%s' % (*x, y)
'1,2,hello'
22
falsetru

おそらく str.format() をご覧ください。

>>> x = (5,7)
>>> template = 'first: {}, second: {}'
>>> template.format(*x)
'first: 5, second: 7'

更新:

完全を期すために、 PEP 448 で説明されている追加のアンパック一般化も含めています。拡張構文はPython 3.5で導入され、以下は構文エラーではなくなりました。

>>> x = (5, 7)
>>> y = 42
>>> template = 'first: {}, second: {}, last: {}'
>>> template.format(*x, y)  # valid in Python3.5+
'first: 5, second: 7, last: 42'

Python 3.4以下では、アンパックされたタプルの後に追加の引数を渡したい場合は、おそらく名前付き引数

>>> x = (5, 7)
>>> y = 42
>>> template = 'first: {}, second: {}, last: {last}'
>>> template.format(*x, last=y)
'first: 5, second: 7, last: 42'

これにより、最後に1つの余分な要素を含む新しいTupleを作成する必要がなくなります。

10
plamut

str.formatの代わりにstr %を使用することをお勧めします。これは「より現代的」であり、優れた機能セットも備えているためです。それはあなたが欲しいものは次のとおりです:

>>> x = (1,2)
>>> y = 'hello'
>>> '{},{},{}'.format(*(x + (y,)))
1,2,hello

formatのすべてのクールな機能(および%に関連する機能)については、 PyFormat をご覧ください。

2
Fabio Menegazzo