Печать кортежа с форматированием строки в Python


127

Итак, у меня проблема. У меня есть кортеж (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вместо этого.

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

Ответы:


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

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


В Python 3 печать - это функция, а не инструкция, поэтому вам нужно писать print(....).
JG

53

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

t = 1,2,3
print 'This is a tuple {0}'.format(t)

Я добавил комментарий к этому stackoverflow.com/a/26249755/1676424 для случая кортежа из 1 элемента
Jacob CUI

Я никогда не знал, почему %устарело, но теперь я все str.formatравно всегда слепо. Неважно, меня интересует, что такое полный квалификатор, потому что простой {0}- это не полный квалификатор, а просто индикатор позиции. Для an то int, что я называю полным квалификатором, будет {0:d}(или, {3:d}например, если int, который нужно напечатать, находится в 4-й позиции в str.formatметоде). Я пробовал распечатать кортеж с использованием {0:s}квалификатора, но это не сработало. Итак, каков полный квалификатор для чего-то вроде кортежа?
Ray

1
@Ray В этом нет никакого смысла. Вы можете указать множество параметров, которые можно найти в документации. Если вы хотите что-то напечатать с помощью, strвы можете сказать {!s}, но это значение по умолчанию, поэтому в этом нет необходимости. Если вы хотите использовать reprвместо этого, вы можете это сделать {!r}. В отличие от with %, dдля целых чисел нет необходимости говорить .
Antimony,

2
Мне нравится% синтаксис, поскольку он, на мой взгляд, менее подробен, чем новый формат, а также очень похож на форматирование строки c, которое я знаю и люблю
Паулюс

Обратите внимание, что даже на Python 3 %не полностью устарел. Фактически, pylintдаже будет жаловаться, если вы используете .formatсинтаксис внутри loggingмодуля: stackoverflow.com/a/34634301/534238
Майк Уильямсон

39

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

>>> 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'.


Я перешел на использование format (), но это преимущество метода% (возможность форматировать каждый элемент кортежа и выполнять преобразования) велико, поэтому я думаю, что вернусь. Спасибо.
Bill

1
Вы также можете указать формат для каждого элемента. '{: d} {: s}'. format (1, '2')
zk82

5
«Звездочка распакованы» кортеж хорошо работает с .format: tup = (1,2,3); print('First: {}, Second: {}, Third: {}'.format(*tup)).
m-dz

25
>>> tup = (1, 2, 3)
>>> print "Here it is: %s" % (tup,)
Here it is: (1, 2, 3)
>>>

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

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

(tup,)с конечной запятой - это кортеж, который содержит tupтолько член.


9

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

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.


7
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)

6

Несмотря на то, что этот вопрос довольно старый и имеет много разных ответов, я все же хотел бы добавить imho самый «питонический», а также читаемый / краткий ответ.

Поскольку общий tupleметод печати уже правильно показан Antimony, это дополнение для печати каждого элемента в кортеже отдельно, как правильно показал Фонг Ках Чун с%s синтаксисом.

Интересно, что это было упомянуто только в комментарии, но использование оператора звездочки для распаковки кортежа дает полную гибкость и удобочитаемость с использованием str.formatметода при печати элементов кортежа отдельно .

tup = (1, 2, 3)
print('Element(s) of the tuple: One {0}, two {1}, three {2}'.format(*tup))

Это также позволяет избежать печати конечной запятой при печати одноэлементного кортежа, что обходится Jacob CUI с помощью replace. (Несмотря на то, что imho представление конечной запятой является правильным, если вы хотите сохранить представление типа при печати ):

tup = (1, )
print('Element(s) of the tuple: One {0}'.format(*tup))

5

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

t = (1,2,3)

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

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

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

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


2

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

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
Я обычно предпочитаю что-то вроде 'это кортеж ({})'. Format (',' .join (map (str, t))). Таким образом, вам не придется беспокоиться о том, что вы можете возиться с существующими запятыми или круглыми скобками в строке формата.
Antimony

1
Вы не должны использовать format()в запросах к базе данных. Для этого есть подходящие методы в каждой библиотеке.
ktalik

@ktalik, ты этого явно не понимаешь. format () не имеет ничего общего с запросами к базе данных. format () - обычная функция для строковых операций Python. Загляните на docs.python.org/2/library/string.html, и вы узнаете из него. Запомните, ничего общего с запросами к базе данных.
Джейкоб CUI

Использование format()со значениями, полученными от пользователей, может привести к внедрению SQL. Более безопасно проверять входные значения перед их вводом в запрос. См. Эти рекомендации для получения дополнительной информации: dev.mysql.com/doc/connector-python/en/ ... Вы также можете преобразовать значения параметров в строковое представление типа базы данных, а затем вставить его в строку запроса. Взгляните на initd.org/psycopg/docs/usage.html, где у вас есть контрпример с %оператором и решение с execute()методом, в котором параметры запроса передаются в аргументах метода.
ktalik

1
@Paul Rooney Обратите внимание, что я пытаюсь объяснить, что конечная запятая будет добавлена, если в кортеже есть только один элемент. И это вызовет проблемы при неправильном использовании. Также формат обязательно можно использовать для формирования SQL-запросов. Откуда берутся недоброжелатели ??
Джейкоб CUI


0

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

>>>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 ("Value:% s"% ('1', '2')), что является ошибкой!

Следовательно:

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

Выше будет правильно передано аргументам печати.



0

Вы также можете попробовать это;

tup = (1,2,3)
print("this is a tuple {something}".format(something=tup))

Вы не можете использовать %somethingwith (tup)только из-за концепции упаковки и распаковки с помощью кортежа.


-5

Обсуждение дешево, покажите код:

>>> tup = (10, 20, 30)
>>> i = 50
>>> print '%d      %s'%(i,tup)
50  (10, 20, 30)
>>> print '%s'%(tup,)
(10, 20, 30)
>>> 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.