Друк кортежу зі струнним форматуванням у 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}- це не повний класифікатор, а лише показник позиції. Для того int, що я називаю повним класифікатором, було б {0:d}(або, {3:d}наприклад, якщо int для друку має місце на 4-му положенні str.formatметоду). Я спробував надрукувати кортеж за допомогою {0:s}класифікатора, але він не працює. Отже, який повний кваліфікатор для чогось такого, як кортеж?
Рей

1
@Ray Це насправді не має сенсу. Ви можете вказати безліч варіантів, які можна знайти в документації. Якщо ви хочете надрукувати щось за допомогою str, можете сказати {!s}, але це за замовчуванням, тому це зайве. Якщо ви хочете використовувати reprзамість цього, ви можете зробити {!r}. На відміну від с %, dдля цілих чисел не потрібно говорити .
Сурма

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


Я перейшов до використання формату (), але ця перевага методу% (можливість форматувати кожен елемент кортежу і робити перетворення) є великою, тому я думаю, що повернусь назад. Дякую.
Білл

1
Ви також можете вказати формат для кожного елемента. формат '{: d} {: s}'. (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

Незважаючи на те, що це запитання досить старе і на нього є багато різних відповідей, я все одно хотів би додати найбільш "пітонічний", а також зрозумілий / стислий відповідь.

Оскільки загальна tupleметодика друку вже показана правильно, антимон - це доповнення для друку кожного елемента в кортежі окремо, як правильно показав Фонг Ка Чун із %sсинтаксисом.

Цікаво, що він згадується лише в коментарі, але використання оператора зірочки для розпакування кортежу дає повну гнучкість і читабельність, використовуючи str.formatметод, друкуючи елементи кортежу окремо .

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

Це також дозволяє уникнути друку кінцевої коми через друк одноелементного кортежу, що обійшов Якоб CUI replace. (Навіть незважаючи на те, що імхо представлення кінцевих комок є правильним, якщо потрібно зберегти подання типу під час друку ):

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

вам потрібно розглянути можливість видалення хвостової коми, використовуючи заміну (',)', ')') після форматування, оскільки можливо, що в кортежі є лише 1 елемент на зразок ('Tom',), тож кома для хвоста повинна бути видалена:

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

Будь ласка, підкажіть, чи є у вас пристойний спосіб видалення цієї коми у висновку.


1
Зазвичай я віддаю перевагу щось на зразок "це кортеж ({})". Формат (',' .join (карта (str, t))). Таким чином, вам не доведеться турбуватися про заплутаність із існуючими комами або дужками в рядку формату.
Сурма

1
Не слід використовувати format()в запитах до бази даних. Для цього є застосовні методи в кожній бібліотеці.
ktalik

@ktalik ти цього очевидно не розумієш. format () не має нічого спільного з запитами до бази даних. format () - це загальна функція для операції з рядком python. Погляньте на docs.python.org/2/library/string.html, і ви дізнаєтесь на цьому. Нічого спільного з запитами до бази даних не пам'ятайте.
Jacob CUI

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

1
@Paul Rooney Будь ласка, зверніть увагу, я намагаюся пояснити, якщо в кортежі є лише один предмет, буде додана остання кома. І це спричинить проблеми, якщо неправильно використовувати. Також формат, безумовно, може використовуватися для формування SQL запитів. Звідки беруться недоброзичливці ??
Jacob CUI

2

Окрім методів, запропонованих в інших відповідях, оскільки Python 3.6 ви також можете використовувати Interpolation Literal String (f-string):

>>> tup = (1,2,3)
>>> print(f'this is a tuple {tup}')
this is a tuple (1, 2, 3)

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 ("Значення:% s"% ('1', '2')), що є помилкою!

Звідси:

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

Вище буде подано правильно аргументи друку.



0

Ви можете спробувати і цей;

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

Ви не можете використовувати %somethingз (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.