Mencetak tuple dengan pemformatan string dengan Python

127

Jadi, saya punya masalah ini. Saya mendapat tuple (1,2,3) yang harus saya cetak dengan format string. misalnya.

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

dan ini harus mencetak representasi tuple dengan tanda kurung, seperti

Ini adalah tuple (1,2,3)

Tapi saya TypeError: not all arguments converted during string formattingmalah mendapatkannya .

Bagaimana saya bisa melakukan ini? Agak hilang di sini jadi jika kalian bisa mengarahkan saya ke arah yang benar :)

veturi
sumber

Jawaban:

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

Membuat singleton tuple dengan tuple of interest sebagai satu-satunya item, yaitu (thetuple,)bagian, adalah bagian kunci di sini.

Alex Martelli
sumber
Dalam Python 3 cetak adalah fungsi, bukan pernyataan, jadi Anda harus menulis print(....).
JG
53

Perhatikan bahwa %sintaks sudah usang. Gunakan str.format, yang lebih sederhana dan lebih mudah dibaca:

t = 1,2,3
print 'This is a tuple {0}'.format(t)
Antimon
sumber
Saya menambahkan komentar ke stackoverflow.com/a/26249755/1676424 ini untuk kasus 1 item tuple
Jacob CUI
Saya tidak pernah tahu mengapa %itu usang tetapi saya sekarang selalu Anda str.formattetap membabi buta. Namun demikian, saya tertarik pada apa yang dimaksud kualifikasi penuh, karena sederhana {0}bukan kualifikasi penuh, tetapi hanya indikator posisi. Untuk int, apa yang saya sebut kualifikasi penuh akan {0:d}(atau {3:d}misalnya, jika int yang akan dicetak terjadi pada posisi ke-4 dalam str.formatmetode). Saya sudah mencoba mencetak tuple menggunakan {0:s}kualifikasi tetapi tidak berhasil. Jadi, apa kualifikasi penuh untuk sesuatu seperti tuple?
Ray
1
@ Ray Itu tidak masuk akal. Ada banyak opsi yang dapat Anda tentukan, yang dapat ditemukan di dokumentasi. Jika Anda ingin mencetak sesuatu menggunakan strAnda dapat mengatakan {!s}, tetapi ini adalah default, jadi itu tidak perlu. Jika Anda ingin menggunakannya repr, Anda bisa melakukannya {!r}. Berbeda dengan dengan %, tidak perlu mengatakan duntuk bilangan bulat.
Antimony
2
Saya agak suka% sintaks karena kurang verbose di pikiran saya daripada format baru, dan juga sangat mirip dengan c string format siapa yang saya kenal dan cinta
Paulus
Perhatikan bahwa, bahkan pada Python 3, %itu tidak sepenuhnya usang. Bahkan, pylintbahkan akan mengeluh jika Anda menggunakan .formatsintaks dalam loggingmodul: stackoverflow.com/a/34634301/534238
Mike Williamson
39

Banyak jawaban yang diberikan di atas benar. Cara yang tepat untuk melakukannya adalah:

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

Namun, ada perselisihan tentang apakah '%'operator String sudah usang. Seperti yang telah ditunjukkan banyak orang, sudah pasti tidak usang, karena '%'operator String lebih mudah untuk menggabungkan pernyataan String dengan daftar data.

Contoh:

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

Namun, menggunakan .format()fungsi ini, Anda akan berakhir dengan pernyataan verbose.

Contoh:

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

Lebih lanjut, '%'Operator string yang juga berguna bagi kita untuk memvalidasi tipe data seperti %s, %d, %i, sementara .format () hanya mendukung dua bendera konversi : '!s'dan'!r' .

Fong Kah Chun
sumber
Saya membuat transisi untuk menggunakan format () tetapi ini keuntungan dari metode% (bisa memformat setiap elemen tuple dan melakukan konversi) besar jadi saya pikir saya akan kembali. Terima kasih.
Bill
1
Anda dapat menentukan format untuk setiap elemen juga. '{: d} {: s}'. format (1, '2')
zk82
5
The "tanda bintang membongkar" tuple bekerja dengan baik dengan .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)
>>>

Perhatikan bahwa itu (tup,)adalah tuple yang berisi tuple. Tupel luar adalah argumen ke operator%. Tuple dalam adalah isinya, yang sebenarnya dicetak.

(tup)adalah ekspresi dalam tanda kurung, yang ketika dievaluasi menghasilkan tup.

(tup,)dengan trailing koma adalah sebuah tuple, yang hanya berisi tupanggota saja.

Vinay Sajip
sumber
9

Ini tidak menggunakan pemformatan string, tetapi Anda harus dapat melakukannya:

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

Jika Anda benar-benar ingin menggunakan pemformatan string:

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

Catatan, ini mengasumsikan Anda menggunakan versi Python lebih awal dari 3.0.

TM.
sumber
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)
Esteban Küber
sumber
6

Meskipun pertanyaan ini sudah cukup lama dan memiliki banyak jawaban berbeda, saya masih ingin menambahkan imho yang paling "pythonic" dan juga jawaban yang mudah dibaca / ringkas.

Karena tuplemetode pencetakan umum sudah ditunjukkan dengan benar oleh Antimony, ini merupakan tambahan untuk mencetak setiap elemen dalam tuple secara terpisah, karena Fong Kah Chun telah menunjukkan dengan benar dengan %ssintaks.

Menariknya itu hanya disebutkan dalam komentar, tetapi menggunakan operator tanda bintang untuk membongkar tuple menghasilkan fleksibilitas dan keterbacaan penuh menggunakan str.formatmetode ketika mencetak elemen tuple secara terpisah .

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

Ini juga menghindari pencetakan koma jejak saat mencetak tupel elemen tunggal, seperti dielakkan oleh Jacob CUI dengan replace. (Meskipun saya mewakili representasi koma trailing sudah benar jika ingin mempertahankan representasi tipe saat mencetak ):

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

Saya pikir cara terbaik untuk melakukan ini adalah:

t = (1,2,3)

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

Jika Anda terbiasa dengan printf format gaya , maka Python mendukung versinya sendiri. Dalam Python, ini dilakukan dengan menggunakan operator "%" yang diterapkan pada string (kelebihan dari operator modulo), yang mengambil string apa pun dan menerapkan format gaya printf padanya.

Dalam kasus kami, kami mengatakannya untuk mencetak "Ini adalah tuple:", dan kemudian menambahkan string "% s", dan untuk string aktual, kami meneruskan representasi string dari tuple (dengan memanggil str ( t)).

Jika Anda tidak terbiasa dengan format gaya printf, saya sangat menyarankan belajar, karena sangat standar. Sebagian besar bahasa mendukungnya dengan satu atau lain cara.

Edan Maor
sumber
2

Harap perhatikan tanda koma akan ditambahkan jika tuple hanya memiliki satu item. misalnya:

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

dan Anda akan mendapatkan:

'this is a tuple (1,)'

dalam beberapa kasus misalnya Anda ingin mendapatkan daftar kutipan untuk digunakan dalam string kueri mysql seperti

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

Anda perlu mempertimbangkan untuk menghapus koma tailing, gunakan replace (',)', ')') setelah memformat karena mungkin tuple hanya memiliki 1 item seperti ('Tom',), sehingga koma tailing perlu dihapus:

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

Harap sarankan jika Anda memiliki cara yang layak untuk menghapus koma ini di output.

Jacob CUI
sumber
1
Saya biasanya lebih suka sesuatu seperti 'ini format tuple ({})'. (',' .Join (peta (str, t)))). Dengan begitu Anda tidak perlu khawatir untuk mengacaukan koma atau tanda kurung yang ada dalam string format.
Antimony
1
Anda seharusnya tidak menggunakan format()kueri basis data. Ada metode yang berlaku untuk ini di setiap perpustakaan.
ktalik
@ktalik Anda tidak mengerti ini dengan jelas. format () tidak ada hubungannya dengan permintaan basis data. format () adalah fungsi umum untuk operasi string python. Lihatlah docs.python.org/2/library/string.html dan Anda akan belajar darinya. Ingat, tidak ada hubungannya dengan permintaan basis data.
Jacob CUI
Menggunakan format()dengan nilai yang dikumpulkan dari pengguna dapat dihasilkan dengan injeksi SQL. Lebih aman memvalidasi nilai input sebelum memasukkannya ke dalam kueri. Lihat panduan ini untuk info lebih lanjut: dev.mysql.com/doc/connector-python/en/… Anda juga dapat memberikan nilai parameter ke representasi string tipe database dan kemudian menempelkannya ke string kueri. Lihatlah initd.org/psycopg/docs/usage.html di mana Anda memiliki sampel tandingan dengan %operator dan solusi dengan execute()metode tempat parameter kueri diteruskan dalam argumen metode.
ktalik
1
@ Paul Rooney Harap dicatat saya mencoba menjelaskan, koma tambahan akan ditambahkan jika tuple hanya memiliki satu item. DAN itu akan menyebabkan masalah jika tidak digunakan dengan benar. Format juga pasti dapat digunakan untuk membentuk query SQL. Dari mana datangnya para pencela ??
Jacob CUI
2

Selain metode yang diusulkan dalam jawaban lain, karena Python 3.6 Anda juga dapat menggunakan Interpolasi String Literal (f-string):

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

Coba ini untuk mendapatkan jawaban:

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

Jika kita hanya memasukkan satu tuple di dalam (), itu akan membuat tuple sendiri:

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

Ini berarti pernyataan cetak di atas akan terlihat seperti: print ("Nilai:% s"% ('1', '2')) yang merupakan kesalahan!

Karenanya:

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

Di atas akan dimasukkan dengan benar ke argumen cetak.

Yogi
sumber
0

Untuk python 3

tup = (1,2,3)
print("this is a tuple %s" % str(tup))
Wildhammer
sumber
0

Anda dapat mencoba yang ini juga;

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

Anda tidak dapat menggunakan %somethingdengan (tup)hanya karena konsep pengemasan dan membongkar dengan tuple.

Vikash kumar barnwal
sumber
-5

Bicara itu murah, tunjukkan kode:

>>> tup = (10, 20, 30)
>>> i = 50
>>> print '%d      %s'%(i,tup)
50  (10, 20, 30)
>>> print '%s'%(tup,)
(10, 20, 30)
>>> 
123
sumber