Печать кортежа с форматированием строки в Python - PullRequest
109 голосов
/ 21 сентября 2009

Итак, у меня есть эта проблема. Я получил кортеж (1,2,3), который я должен напечатать с форматированием строки. например.

tup = (1,2,3)
print "this is a tuple %something" % (tup)

и это должно вывести представление кортежа в скобках, например

Это кортеж (1,2,3)

Но вместо этого я получаю TypeError: not all arguments converted during string formatting.

Как в мире я могу это сделать? Какая-то потеряна здесь, так что, если вы, ребята, могли бы указать мне правильное направление :)

Ответы [ 10 ]

179 голосов
/ 21 сентября 2009
>>> thetuple = (1, 2, 3)
>>> print "this is a tuple: %s" % (thetuple,)
this is a tuple: (1, 2, 3)

Ключевым битом здесь является создание одноэлементного кортежа с интересующим кортежем в качестве единственного элемента, т.е. части (thetuple,).

45 голосов
/ 21 июня 2012

Обратите внимание, что синтаксис % устарел. Используйте str.format, что проще и удобочитаемее:

t = 1,2,3
print 'This is a tuple {0}'.format(t)
28 голосов
/ 29 марта 2017

Многие ответы, приведенные выше, были правильными. Правильный способ сделать это:

>>> thetuple = (1, 2, 3)
>>> print "this is a tuple: %s" % (thetuple,)
this is a tuple: (1, 2, 3)

Однако возник спор, если оператор '%' String устарел. Как уже отмечали многие, он определенно не устарел, так как оператор '%' String легче комбинировать оператор String с данными списка.

Пример:

>>> tup = (1,2,3)
>>> print "First: %d, Second: %d, Third: %d" % tup
First: 1, Second: 2, Third: 3

Однако, используя функцию .format(), вы получите подробный оператор.

Пример:

>>> tup = (1,2,3)
>>> print "First: %d, Second: %d, Third: %d" % tup
>>> print 'First: {}, Second: {}, Third: {}'.format(1,2,3)
>>> print 'First: {0[0]}, Second: {0[1]}, Third: {0[2]}'.format(tup)

First: 1, Second: 2, Third: 3
First: 1, Second: 2, Third: 3
First: 1, Second: 2, Third: 3

Более того, строковый оператор '%' также полезен для проверки типа данных, таких как %s, %d, %i, тогда как .format () поддерживает только два флага преобразования : '!s' и '!r'.

22 голосов
/ 21 сентября 2009
>>> tup = (1, 2, 3)
>>> print "Here it is: %s" % (tup,)
Here it is: (1, 2, 3)
>>>

Обратите внимание, что (tup,) - это кортеж, содержащий кортеж. Внешний кортеж является аргументом оператора%. Внутренний кортеж - это его содержимое, которое фактически напечатано.

(tup) - это выражение в скобках, которое при оценке приводит к tup.

(tup,) с завершающей запятой представляет собой кортеж, который содержит tup как единственный член.

8 голосов
/ 21 сентября 2009

Это не использует форматирование строки, но вы должны быть в состоянии сделать:

print 'this is a tuple ', (1, 2, 3)

Если вы действительно хотите использовать форматирование строки:

print 'this is a tuple %s' % str((1, 2, 3))
# or
print 'this is a tuple %s' % ((1, 2, 3),)

Обратите внимание, это предполагает, что вы используете версию Python более раннюю, чем 3.0.

4 голосов
/ 21 сентября 2009
t = (1, 2, 3)

# the comma (,) concatenates the strings and adds a space
print "this is a tuple", (t)

# format is the most flexible way to do string formatting
print "this is a tuple {0}".format(t)

# classic string formatting
# I use it only when working with older Python versions
print "this is a tuple %s" % repr(t)
print "this is a tuple %s" % str(t)
1 голос
/ 08 октября 2014

Обратите внимание, что запятая будет добавлена, если в кортеже есть только один элемент. например:

t = (1,)
print 'this is a tuple {}'.format(t)

и вы получите:

'this is a tuple (1,)'

в некоторых случаях, например Вы хотите получить список в кавычках для использования в строке запроса mysql, например

SELECT name FROM students WHERE name IN ('Tom', 'Jerry');

вам нужно рассмотреть вопрос об удалении хвостовой запятой с помощью replace (',)', ')') после форматирования, поскольку возможно, что кортеж имеет только 1 элемент типа ('Tom',), поэтому запятую в быть удаленным:

query_string = 'SELECT name FROM students WHERE name IN {}'.format(t).replace(',)', ')')

Пожалуйста, предложите, если у вас есть достойный способ удалить эту запятую в выводе.

1 голос
/ 21 сентября 2009

Я думаю, что лучший способ сделать это:

t = (1,2,3)

print "This is a tuple: %s" % str(t)

Если вы знакомы с форматированием в стиле printf , то Python поддерживает свою собственную версию. В Python это делается с помощью оператора «%», применяемого к строкам (перегрузка оператора по модулю), который принимает любую строку и применяет к ней форматирование в стиле printf.

В нашем случае мы говорим ему напечатать «Это кортеж:», а затем добавляем строку «% s», и для фактической строки мы передаем строковое представление кортежа ( вызов str (t)).

Если вы не знакомы с форматированием в стиле printf, я настоятельно рекомендую учиться, так как это очень стандартно. Большинство языков так или иначе поддерживают это.

0 голосов
/ 02 июня 2018

Попробуйте получить ответ:

>>>d = ('1', '2') 
>>> print("Value: %s" %(d))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting

Если мы поместим только один кортеж внутрь (), он сам создаст кортеж:

>>> (d)
('1', '2')

Это означает, что приведенный выше оператор печати будет выглядеть так: print ("Значение:% s"% ('1', '2')), что является ошибкой!

Таким образом:

>>> (d,)
(('1', '2'),)
>>> 

Выше будет корректно указан аргумент печати. ​​

0 голосов
/ 10 мая 2017

Говори дешево, покажи код:

>>> tup = (10, 20, 30)
>>> i = 50
>>> print '%d      %s'%(i,tup)
50  (10, 20, 30)
>>> print '%s'%(tup,)
(10, 20, 30)
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...