การพิมพ์ทูเพิลด้วยการจัดรูปแบบสตริงใน 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แทน

ฉันจะทำสิ่งนี้ได้อย่างไรในโลกนี้ Kinda หายไปที่นี่ดังนั้นถ้าพวกคุณสามารถชี้ทางที่ถูกต้อง :)

คำตอบ:


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

การสร้างทูเพิลซิงเกิลที่มีทูเพิลที่น่าสนใจเป็นรายการเดียวคือพาร์(thetuple,)ทเป็นคีย์บิตที่นี่


ในหลาม 3 print(....)พิมพ์เป็นฟังก์ชั่นไม่ได้คำสั่งเพื่อให้คุณมีการเขียน
JG

53

โปรดทราบว่า%ไวยากรณ์ล้าสมัย ใช้str.formatซึ่งง่ายกว่าและอ่านง่ายกว่า:

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

ฉันเพิ่มความคิดเห็นในstackoverflow.com/a/26249755/1676424นี้สำหรับกรณีของ tuple 1 รายการ
Jacob CUI

ฉันไม่เคยรู้ว่าทำไมถึง%ล้าสมัย แต่ตอนนี้ฉันก็ยังคงเป็นคุณstr.formatอยู่แล้ว ไม่เป็นไรฉันสนใจว่าผู้ผ่านการคัดเลือกแบบเต็มคืออะไรเพราะแบบธรรมดา{0}ไม่ใช่ผู้คัดเลือกแบบเต็ม แต่เป็นเพียงตัวบ่งชี้ตำแหน่งเท่านั้น สำหรับintสิ่งที่ฉันเรียกว่าคุณสมบัติเต็มจะเป็น{0:d}(หรือ{3:d}ตัวอย่างเช่นถ้า int ที่จะพิมพ์เกิดขึ้นในตำแหน่งที่ 4 ในstr.formatเมธอด) ฉันได้ลองพิมพ์ทูเปิลโดยใช้{0:s}qualifier แต่ไม่ได้ผล แล้วอะไรคือคุณสมบัติที่สมบูรณ์ของสิ่งต่างๆเช่นทูเพิล?
Ray

1
@Ray นั่นไม่สมเหตุสมผลเลย มีตัวเลือกมากมายที่คุณสามารถระบุได้ซึ่งสามารถพบได้ในเอกสารประกอบ หากคุณต้องการพิมพ์บางอย่างโดยใช้strคุณสามารถพูด{!s}ได้ แต่นี่เป็นค่าเริ่มต้นดังนั้นจึงไม่จำเป็น หากคุณต้องการที่จะใช้แทนที่คุณสามารถทำได้repr {!r}แตกต่างกับ%ไม่มีความจำเป็นที่จะบอกว่าdสำหรับจำนวนเต็ม
Antimony

2
ฉันชอบ% syntax เนื่องจากมันเป็น verbose ในใจของฉันน้อยกว่ารูปแบบใหม่และยังคล้ายกับการจัดรูปแบบสตริง c ที่ฉันรู้จักและชื่นชอบ
Paulus

โปรดทราบว่าแม้ใน Python 3 %ก็ยังไม่ล้าสมัยอย่างสมบูรณ์ ในความเป็นจริงpylintจะบ่นด้วยซ้ำหากคุณใช้.formatไวยากรณ์ภายในloggingโมดูล: stackoverflow.com/a/34634301/534238
Mike Williamson

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()ฟังก์ชันนี้คุณจะจบลงด้วยคำสั่ง verbose

ตัวอย่าง:

>>> 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}'. format (1, '2')
zk82

5
"การดอกจันแตก" tuple ทำงานได้ดีกับ:.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

แม้ว่าคำถามนี้จะค่อนข้างเก่าและมีคำตอบที่แตกต่างกันมากมาย แต่ฉันก็ยังคงต้องการเพิ่ม "pythonic" ที่สุดของ imho และคำตอบที่อ่านได้ / กระชับ

เนื่องจากtupleวิธีการพิมพ์ทั่วไปได้แสดงอย่างถูกต้องแล้วโดย Antimony นี่จึงเป็นส่วนเพิ่มเติมสำหรับการพิมพ์แต่ละองค์ประกอบในทูเปิลแยกกันดังที่ Fong Kah Chun ได้แสดงไว้อย่างถูกต้องด้วย%sไวยากรณ์

ที่น่าสนใจจะได้รับการกล่าวถึงในความคิดเห็น แต่ใช้เครื่องหมายดอกจันผู้ประกอบการที่จะแกะ tuple ถัวเฉลี่ยความยืดหยุ่นและความสามารถในการอ่านโดยใช้str.formatวิธีเมื่อพิมพ์องค์ประกอบ tuple แยกต่างหาก

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

นอกจากนี้ยังหลีกเลี่ยงการพิมพ์เครื่องหมายจุลภาคต่อท้ายเมื่อพิมพ์ tuple องค์ประกอบเดียวเช่นโกงโดยจาค็อบ 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 ( t))

หากคุณไม่คุ้นเคยกับการจัดรูปแบบสไตล์ 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');

คุณต้องพิจารณาที่จะลบเครื่องหมายจุลภาค tailing ให้ใช้การแทนที่ (',)', ')') หลังจากการจัดรูปแบบเนื่องจากเป็นไปได้ว่าทูเพิลมีเพียง 1 รายการเช่น ('Tom',) ดังนั้นจึงต้องลบเครื่องหมายจุลภาคสำหรับการกำหนดหาง:

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

โปรดแนะนำว่าคุณมีวิธีที่เหมาะสมในการลบเครื่องหมายจุลภาคนี้ในเอาต์พุตหรือไม่


1
ฉันมักจะชอบอะไรเช่น 'this is a tuple ({})'. format (',' .join (map (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()เมธอดที่มีการส่งพารามิเตอร์เคียวรีในเมธอด args
ktalik

1
@ พอลรูนีย์โปรดทราบว่าฉันกำลังพยายามอธิบายอยู่จะมีการเพิ่มจุลภาคต่อท้ายหากทูเพิลมีเพียงรายการเดียว และจะทำให้เกิดปัญหาหากใช้ไม่ถูกต้อง นอกจากนี้ยังสามารถใช้รูปแบบเพื่อสร้างแบบสอบถาม SQL ได้ ผู้ว่ามาจากไหน ??
Jacob CUI

2

นอกเหนือจากวิธีการที่เสนอในคำตอบอื่น ๆ เนื่องจาก Python 3.6 คุณยังสามารถใช้Literal String Interpolation (f-strings):

>>> 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 ("Value:% s"% ('1', '2')) ซึ่งเป็นข้อผิดพลาด!

ดังนั้น:

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

ด้านบนจะถูกป้อนเข้ากับอาร์กิวเมนต์ของการพิมพ์อย่างถูกต้อง



0

คุณสามารถลองอันนี้ได้เช่นกัน

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

คุณไม่สามารถใช้%somethingกับ(tup)เพียงเพราะการบรรจุและการเอาออกแนวคิดกับ tuple


-5

พูดคุยราคาถูกแสดงรหัส:

>>> tup = (10, 20, 30)
>>> i = 50
>>> print '%d      %s'%(i,tup)
50  (10, 20, 30)
>>> print '%s'%(tup,)
(10, 20, 30)
>>> 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.