2012-05-01 18 views
4

私は に適切な数の変数にsplit()の戻り値を割り当て/解凍することができますが、フォーマット指示文を使用した 印刷文字列では使用できません。分割印刷の割り当てが機能しないのはなぜですか?

例えばは、与えられた:

In [202]: s 
Out[202]: 'here are 4 values' 

In [203]: s.split() 
Out[203]: ['here', 'are', '4', 'values'] 

この期待通りに動作します:

In [204]: a, b, c, d = s.split() 

In [205]: print '%s %s %s %s' % (a, b, c, d) 
here are 4 values 

しかし、これは失敗した。..

In [206]: print '%s %s %s %s' % (s.split()) 

私がなぜわかりませんか? split()の返品を にして、 の書式設定文字列の予想される引数に分配するべきではありませんか?

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
C:\bla\Desktop\<ipython-input-206-600f130ff0b2> in <module>() 
----> 1 print '%s %s %s %s' % (s.split()) 

TypeError: not enough arguments for format string 

「十分な議論をしてください」リストには正しい数の項目があります。この場合、何らかの理由でリストが展開されないのですが、変数への代入がありますか?

私はあなたがフォーマットのためにそう

>>> s = 'here are 4 values' 
>>> '%s %s %s %s' % tuple(s.split()) 
'here are 4 values' 

ようタプルにs.split()を変換または引数を開梱、代わりに.format()を使用する必要があり、この質問 writing column entry just one below another in python

答えて

4

にお答えしようとする中で、この出くわしました。

'{0} {1} {2} {3}'.format(*s.split()) 
+0

を:

>>> s = 'Here are some values' >>> '{} {} {} {}'.format(*s.split()) 'Here are some values' 

@senderleはこの構文はここでしか、Pythonの2.7とアップのために働くことを指摘し、以前のバージョンで動作するコードは次のようになります。ここで働く方法です。タプルが必要ですか?なぜなら、%に続く最後のprintステートメントに与えるものはタプル(これまで考えていた引数のリストではありません)であるからです。 – Levon

+0

はいタプルが必要だと思います。 – jamylak

+0

ありがとう! – Levon

1
>>> s = 'here are 4 values' 
>>> print '%s %s %s %s' % tuple(s.split()) 
here are 4 values 
>>> print '%s' % s.split() 
['here', 'are', '4', 'values'] 

Pythonのは、それが唯一の1つのパラメータが必要ですので、文字列にリストを変換しようとしている

4

根本的な問題は% -formattingや開梱が全く関連していないということです。 %は、値がタプルであることをが要求します。他の種類の配列won't work。しかし、単一の非タプル値も受け入れます。

これは、望ましいかどうかに関わらず、すべてのタプルが値のタプルとして解釈されるという不運な結果をもたらします。だから、として値をタプルを処理するために、あなたは他のタプルでそれを包むために持っている:

>>> '%s' % ('a', 'b') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: not all arguments converted during string formatting 
>>> '%s' % (('a', 'b'),) 
"('a', 'b')" 

formatを使用すると、とにかく望ましいです。

+0

ああ、ありがと...私はそれについて疑問に思っていた。今までは、最後の '% 'の後に括弧内の項目がタプルではなくパラメータリストとして提供されていると考えました。 – Levon

3

私は、%が引数のアンパックを許可しないという問題があると信じています。 - おかげで動作します

>>> s = 'Here are some values' 
>>> '{0} {1} {2} {3}'.format(*s.split()) 
'Here are some values' 
関連する問題