2014-11-05 2 views
3

Я пытаюсь использовать метод str.format() и с некоторыми трудностями, когда мои значения хранятся в кортеже. Например, если я делаю:Python 3 - использование кортежей в str.format()

s = "x{}y{}z{}" 
s.format(1,2,3) 

Тогда я получаю 'x1y2z3' - нет проблем.
Однако, когда я пытаюсь:

s = "x{}y{}z{}" 
tup = (1,2,3) 
s.format(tup) 

я

IndexError: tuple index out of range. 

Так как я могу 'преобразовать' кортеж на отдельные переменные? или любые другие обходные идеи?

+0

Вы на самом деле проходит один аргумент, который является 'tuple'. –

ответ

10

Pass в кортеже с помощью *arg variable arguments call syntax:

s = "x{}y{}z{}" 
tup = (1,2,3) 
s.format(*tup) 

* перед тем tup говорит Python распаковать кортеж на отдельные аргументы, как если бы вы назвали s.format(tup[0], tup[1], tup[2]) вместо этого.

Или вы можете индексировать первый позиционный аргумент:

s = "x{0[0]}y{0[1]}z{0[2]}" 
tup = (1,2,3) 
s.format(tup) 

Демо:

>>> tup = (1,2,3) 
>>> s = "x{}y{}z{}" 
>>> s.format(*tup) 
'x1y2z3' 
>>> s = "x{0[0]}y{0[1]}z{0[2]}" 
>>> s.format(tup) 
'x1y2z3' 
+0

Спасибо! это сработало, но можете ли вы объяснить больше, что на самом деле происходит с *? или перевести меня в нужное место в документации? – soungalo

+0

@soungalo: см. [Что делает \ * \ * (двойная звезда) и \ * (звезда) для параметров Python?] (Http://stackoverflow.com/q/36901) –

-1

Вы можете распаковать contants кортежа.

s=s.format(*t)

+0

Это, кажется, ничего не добавляет уже не охваченных в существующем ответе. – Kevin

+0

@ Кевин - Так опустите его. Не отмечайте его. – ArtOfWarfare

Смежные вопросы