Форматирование строки Python с знаком процента

Я пытаюсь сделать следующее:

>>> x = (1,2)
>>> y = 'hello'
>>> '%d,%d,%s' % (x[0], x[1], y)
'1,2,hello'

Однако у меня длинный x, более двух элементов, поэтому я попытался:

>>> '%d,%d,%s' % (*x, y)

но это синтаксическая ошибка. Каким будет правильный способ сделать это без индексации, как в первом примере?

Ответы

Ответ 1

str % .. принимает кортеж как правый операнд, поэтому вы можете сделать следующее:

>>> x = (1, 2)
>>> y = 'hello'
>>> '%d,%d,%s' % (x + (y,))  # Building a tuple of `(1, 2, 'hello')`
'1,2,hello'

Ваша попытка должна работать в Python 3. где Additional Unpacking Generalizations поддерживается, но не в Python 2.x:

>>> '%d,%d,%s' % (*x, y)
'1,2,hello'

Ответ 2

Возможно, посмотрите str.format().

>>> x = (5,7)
>>> template = 'first: {}, second: {}'
>>> template.format(*x)
'first: 5, second: 7'

Обновление:

Для полноты я также включаю дополнительные распаковывающие обобщения, описанные PEP 448. Расширенный синтаксис был введен в Python 3.5, и следующее больше не является синтаксической ошибкой:

>>> x = (5, 7)
>>> y = 42
>>> template = 'first: {}, second: {}, last: {}'
>>> template.format(*x, y)  # valid in Python3.5+
'first: 5, second: 7, last: 42'

В Python 3.4 и ниже, однако, если вы хотите передать дополнительные аргументы после распакованного кортежа, вам, вероятно, лучше всего передать их как именованные аргументы:

>>> x = (5, 7)
>>> y = 42
>>> template = 'first: {}, second: {}, last: {last}'
>>> template.format(*x, last=y)
'first: 5, second: 7, last: 42'

Это позволяет избежать необходимости создания нового кортежа, содержащего один дополнительный элемент в конце.

Ответ 3

Я предлагаю вам использовать str.format вместо str %, так как он "более современный", а также имеет лучший набор функций. Это означает, что вы хотите:

>>> x = (1,2)
>>> y = 'hello'
>>> '{},{},{}'.format(*(x + (y,)))
1,2,hello

Для всех интересных функций format (и некоторые из них относятся к %), посмотрите PyFormat.