为什么分割打印格式的分配不起作用?

时间:2012-05-01 07:40:16

标签: python string split string-formatting

我很困惑为什么我可以分配/解包split()的回复 适当数量的变量,但同样在a中使用失败 使用格式化指令打印字符串。

,例如:

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

“注意足够的参数”..我在列表中确实有正确数量的项目。出于某种原因,列表是否在这种情况下不解包,而是与变量赋值有关吗?

我试图回答这个问题时遇到了这个问题 writing column entry just one below another in python

4 个答案:

答案 0 :(得分:4)

您必须将s.split()转换为像这样的元组

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

用于格式化或使用.format()代替,解压缩参数。

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

答案 1 :(得分:4)

根本问题是% - 格式化和解包完全没有关系。 % 要求值为元组;其他类型的序列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

答案 2 :(得分:3)

我认为问题是%不允许参数解包。这是一种有效的方法:

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

@senderle指出这种语法仅适用于python 2.7及更高版本,这里的代码适用于以前的版本:

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

答案 3 :(得分: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个参数