如何将tuple1 if ... else tuple2传递给str.format?

时间:2015-05-12 08:15:26

标签: 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

我使用的是python 2.6。

3 个答案:

答案 0 :(得分:15)

☞索引选项:

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

yes = True
print 'no [{0[0]}] yes [{0[1]}]'.format((" ", "x") if yes else ("x", " "))
在调用tulple的索引

时格式字符串中的

{0[0]}等于(" ", "x")[0] 在调用tulple的索引

时格式字符串中的

{0[1]}等于(" ", "x")[1]

*运算符选项:

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

yes = True
print 'no [{0}] yes [{1}]'.format(*(" ", "x") if yes else ("x", " "))

在调用*运算符时,如果if语句为'no [{0}] yes [{1}]'.format(*(" ", "x") if yes else ("x", " ")),则'no [{0}] yes [{1}]'.format(" ", "x")等于True

**运算符选项(当你的var是dict时它的额外方法):

yes = True
print 'no [{no}] yes [{yes}]'.format(**{"no":" ", "yes":"x"} if yes else {"no":"x", "yes":" "})

答案 1 :(得分:8)

使用*运算符,它接受一个可迭代的参数并将每个参数作为函数的位置参数提供:

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

答案 2 :(得分:6)

这里的问题是你只向string.format()提供一个参数:一个元组。当您使用{0}{1}时,您指的是传递给string.format()的第0个和第1个参数。由于实际上没有第一个参数,因此会出现错误。

@Patrick Collins建议的*运算符可以工作,因为它解包了元组中的参数,将它们转换为单个变量。就好像你调用了string.format(“”,“x”)(或者反之)

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