Форматирование строки 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.