Python 如果。。。是否将tuple2转换为str.format?

Python 如果。。。是否将tuple2转换为str.format?,python,tuples,string-formatting,Python,Tuples,String Formatting,简单地说,为什么会出现以下错误 >>> yes = True >>> 'no [{0}] yes [{1}]'.format((" ", "x") if yes else ("x", " ")) Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: tuple index out of range >>是=真 >>>'否

简单地说,为什么会出现以下错误

>>> yes = True
>>> 'no [{0}] yes [{1}]'.format((" ", "x") if yes else ("x", " "))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
>>是=真
>>>'否[{0}]是[{1}]'。格式((“”,“x”)如果是,否则(“”,“x”))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
索引器错误:元组索引超出范围

我使用python 2.6。

使用
*
操作符,它接受一个iterable参数,并将每个参数作为位置参数提供给函数:

In [3]: 'no [{0}] yes [{1}]'.format(*(" ", "x") if yes else ("x", " "))
Out[3]: 'no [ ] yes [x]'
☞ 索引选项:

访问格式字符串中的参数项时,应使用索引调用值:

yes = True
print 'no [{0[0]}] yes [{0[1]}]'.format((" ", "x") if yes else ("x", " "))
{0[0]}
格式字符串等于tulple的调用索引中的
(“”,“x”)[0]

{0[1]}
格式字符串等于tulple的调用索引中的
(“”,“x”)[1]


☞ <代码>*操作员选项:

或者您可以使用
*
运算符来解包参数元组

yes = True
print 'no [{0}] yes [{1}]'.format(*(" ", "x") if yes else ("x", " "))
调用
*
运算符时,
'no[{0}]yes[{1}]'.format(*(“”,x)if-yes,else(“x”),
等于
'no[{0}]yes[{1}]'。format(“,”x”)
if语句为
True


☞ <代码>**运算符选项(当var为dict时,这是额外的方法):


这里的问题是,您只为
string.format()
提供了一个参数:元组。当您使用
{0}
{1}
时,您指的是传递给
string.format()
的第0个和第1个参数。因为实际上没有第一个参数,所以您会得到一个错误

@Patrick Collins建议的*运算符之所以有效,是因为它将参数解包为元组,将它们转换为单个变量。这就好像您调用了string.format(“,“x”)(或者反过来)


@Tony Yang建议的索引选项之所以有效,是因为它引用了传递给
format()
的一个元组的各个元素,而不是试图引用第二个参数。

问题在于,在原始代码中,您将一个元组作为第一个参数,而不是两个参数(字符串的格式要求)。
*
运算符将元组扩展为两个参数,而不是一个。@wonderb0lt我遵循OP的格式字符串建议的结构,而不是他的问题,我怀疑这是他真正想要做的。依我看,
{0[0]}..{0{1}
要难看得多,也没有必要。@PatrickCollins当然,我是说我的评论是为了让OP了解这里发生了什么(在您的答案包含该信息之前):)您实际上只提供了一个格式化参数。要获得两个值,即解包一个元组,应该使用splat运算符。请参阅。您可能想考虑<代码> 'NO[{NO}]是[ {是} ]。格式化(***“否”:NOVALY,“是”:YESValue})< /代码>
yes = True
print 'no [{no}] yes [{yes}]'.format(**{"no":" ", "yes":"x"} if yes else {"no":"x", "yes":" "})