リストでのPython文字列フォーマットの使用


111

sPython 2.6.5で文字列を作成します。これには、さまざまな数の%sトークンがあり、リストのエントリ数と一致しますx。フォーマットされた文字列を書き出す必要があります。以下は機能しませんが、私がやろうとしていることを示しています。この例では、3つの%sトークンがあり、リストには3つのエントリがあります。

s = '%s BLAH %s FOO %s BAR'
x = ['1', '2', '3']
print s % (x)

出力文字列を次のようにしたい:

1 BLAH 2 FOO 3 BAR

回答:


112
print s % tuple(x)

の代わりに

print s % (x)

5
(x)と同じですx。単一のトークンを大括弧で囲んでも、Pythonでは意味がありません。通常foo = (bar, )、読みやすくするために角かっこを入れますが、foo = bar,まったく同じことを行います。
11

11
print s % (x)OPが書いたものです、私は彼/彼女を引用していました。
赤外線

私はあなたの答えを批判するのではなく、単に言語のヒントを提供していました(実際、私は+1しました)。foo = (bar, )どちらも書きませんでした:)
patrys

2
(x)わかりやすくするために表記を使用しています。また、後で追加の変数を追加する場合に、括弧を忘れることも回避します。
SabreWolfy、2011

複数のリストから変数を調達したい場合はどうでしょうか?タプルは単一のリストのみを受け取り、フォーマッタは単一のタプルのみを受け取るようです
errant.info

150

Pythonのフォーマットメソッドを確認する必要があります。次に、次のようにフォーマット文字列を定義できます。

>>> s = '{0} BLAH BLAH {1} BLAH {2} BLAH BLIH BLEH'
>>> x = ['1', '2', '3']
>>> print s.format(*x)
'1 BLAH BLAH 2 BLAH 3 BLAH BLIH BLEH'

1
OPの問題はメソッドではなく、パラメーターの形式です。%オペレーターはタプルのみをアンパックします。
11

s単純%sに各ポジションについてではなく、増分する数値を含める必要があるため、これは構造をより複雑にします。sはさまざまなステップで構築されるため、%sトークンを含めるだけの方がはるかに簡単です。
SabreWolfy、2011

2
@SabreWolfy手続き的に構築する場合は、プレースホルダーに名前を付け、dictを使用して結果の文字列をフォーマットする方が簡単な場合がありますprint u'%(blah)d BLAHS %(foo)d FOOS …' % {'blah': 15, 'foo': 4}
2011

2
@SabreWolfy:でのPython 2.7、あなたはフィールド番号を省略することができます:s = '{} BLAH {} BLAH BLAH {} BLAH BLAH BLAH'
追って通知があるまで一時停止しました。

この回答は混乱を招く可能性があります。0、1、および2の数値は、「BLAH」という単語の出現回数に何らかの関係があるように見えるためです。
SabreWolfy

31

このリソースページに続いて、xの長さが変化する場合は、次を使用できます。

', '.join(['%.2f']*len(x))

リストから各要素のプレースホルダーを作成しますx。次に例を示します。

x = [1/3.0, 1/6.0, 0.678]
s = ("elements in the list are ["+', '.join(['%.2f']*len(x))+"]") % tuple(x)
print s
>>> elements in the list are [0.33, 0.17, 0.68]

1
リンクは現在死んでいます。
MKハンター

19

こちらがワンライナーです。リストを反復するためにprint()でformatを使用する少し即興の答え。

これはどうですか(python 3.x):

sample_list = ['cat', 'dog', 'bunny', 'pig']
print("Your list of animals are: {}, {}, {} and {}".format(*sample_list))

format()の使用については、こちらのドキュメントをご覧ください。


18

私はこの素晴らしいこと(フォーマット文字列内からリストにインデックスを付けること)について学んだので、この古い質問に追加しています。

s = '{x[0]} BLAH {x[1]} FOO {x[2]} BAR'
x = ['1', '2', '3']
print (s.format (x=x))

出力:

1 BLAH 2 FOO 3 BAR

ただし、私はまだ(フォーマット文字列内で)スライスを行う方法を理解していない'"{x[2:4]}".format...ため、誰かがアイデアを持っている場合はそれを見つけたいと思いますが、あなたが単にそれを行うことはできないと思います。


スライスのユースケースについて少し興味があります。
マイケル

1
私は本当に1つを持っていません...できることはきちんとできると思いました
Joran Beasley

11

これは楽しい質問でした!可変長リストでこれを処理する別の方法は、.formatメソッドとリストのアンパックを最大限に活用する関数を作成することです。次の例では、凝った書式設定は使用していませんが、ニーズに合わせて簡単に変更できます。

list_1 = [1,2,3,4,5,6]
list_2 = [1,2,3,4,5,6,7,8]

# Create a function that can apply formatting to lists of any length:
def ListToFormattedString(alist):
    # Create a format spec for each item in the input `alist`.
    # E.g., each item will be right-adjusted, field width=3.
    format_list = ['{:>3}' for item in alist] 

    # Now join the format specs into a single string:
    # E.g., '{:>3}, {:>3}, {:>3}' if the input list has 3 items.
    s = ','.join(format_list)

    # Now unpack the input list `alist` into the format string. Done!
    return s.format(*alist)

# Example output:
>>>ListToFormattedString(list_1)
'  1,  2,  3,  4,  5,  6'
>>>ListToFormattedString(list_2)
'  1,  2,  3,  4,  5,  6,  7,  8'

3

@neobotの回答と同じですが、もう少しモダンで簡潔です。

>>> l = range(5)
>>> " & ".join(["{}"]*len(l)).format(*l)
'0 & 1 & 2 & 3 & 4'

0
x = ['1', '2', '3']
s = f"{x[0]} BLAH {x[1]} FOO {x[2]} BAR"
print(s)

出力は

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