ใช้การจัดรูปแบบสตริง Python ด้วย Lists


112

ฉันสร้างสตริงsในหลาม 2.6.5 ซึ่งจะมีจำนวนที่แตกต่างของราชสกุลซึ่งตรงกับจำนวนของรายการในรายการ%s xฉันต้องเขียนสตริงที่จัดรูปแบบ สิ่งต่อไปนี้ไม่ได้ผล แต่เป็นการระบุสิ่งที่ฉันกำลังพยายามทำ ในตัวอย่างนี้มี%sโทเค็นสามรายการและรายการมีสามรายการ

s = '%s BLAH %s FOO %s BAR'
x = ['1', '2', '3']
print s % (x)

ฉันต้องการให้สตริงเอาต์พุตเป็น:

1 BLAH 2 FOO 3 BAR

คำตอบ:


112
print s % tuple(x)

แทน

print s % (x)

5
(x)xเป็นสิ่งเดียวกับ การใส่โทเค็นเดียวในวงเล็บไม่มีความหมายใน Python คุณมักจะใส่วงเล็บfoo = (bar, )เพื่อให้อ่านง่ายขึ้น แต่foo = bar,ก็เหมือนกันทุกประการ
patrys

11
print s % (x)คือสิ่งที่ OP เขียนฉันแค่อ้างถึงเขา / เธอ
อินฟราเรด

ฉันแค่ให้ทิปภาษาไม่ได้วิจารณ์คำตอบของคุณ (อันที่จริงฉัน +1 แล้ว) คุณไม่ได้เขียนfoo = (bar, )เช่นกัน :)
patrys

2
ฉันใช้(x)สัญกรณ์เพื่อความชัดเจน นอกจากนี้ยังหลีกเลี่ยงการลืมวงเล็บหากคุณเพิ่มตัวแปรเพิ่มเติมในภายหลัง
SabreWolfy

แล้วถ้าคุณต้องการแหล่งที่มาของตัวแปรจากหลายรายการล่ะ? ทูเปิลใช้เวลาเพียงรายการเดียวและฟอร์แมตเตอร์ดูเหมือนจะใช้ทูเพิลตัวเดียวเท่านั้น
errant.info

150

คุณควรดูวิธีการจัดรูปแบบของ python จากนั้นคุณสามารถกำหนดสตริงการจัดรูปแบบของคุณได้ดังนี้:

>>> s = '{0} BLAH BLAH {1} BLAH {2} BLAH BLIH BLEH'
>>> x = ['1', '2', '3']
>>> print s.format(*x)
'1 BLAH BLAH 2 BLAH 3 BLAH BLIH BLEH'

1
ปัญหาของ OP ไม่ใช่วิธีการ แต่เป็นรูปแบบของพารามิเตอร์ %ตัวดำเนินการแกะเฉพาะสิ่งที่เพิ่มขึ้นเท่านั้น
patrys

สิ่งนี้จะทำให้การสร้างsมีความซับซ้อนมากขึ้นเนื่องจากฉันจำเป็นต้องรวมตัวเลขที่เพิ่มขึ้นแทนที่จะเป็นเพียงแค่%sสำหรับแต่ละตำแหน่ง sถูกสร้างขึ้นในหลายขั้นตอนดังนั้นจึงง่ายกว่ามากที่จะรวม%sโทเค็น
SabreWolfy

2
@SabreWolfy ถ้าคุณสร้างมัน precedurally แล้วคุณอาจพบว่ามันง่ายที่จะตั้งชื่อตัวยึดตำแหน่งของคุณและใช้ Dict print u'%(blah)d BLAHS %(foo)d FOOS …' % {'blah': 15, 'foo': 4}ให้รูปแบบสตริงที่เกิด:
patrys

2
@SabreWolfy: ใน Python 2.7 คุณสามารถละเว้นหมายเลขฟิลด์:s = '{} BLAH {} BLAH BLAH {} BLAH BLAH BLAH'
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบเพิ่มเติม

คำตอบนี้อาจทำให้สับสนได้เนื่องจากดูเหมือนว่าค่าตัวเลขของ 0, 1 และ 2 จะเกี่ยวข้องกับจำนวนครั้งที่คำว่า "BLAH" ปรากฏขึ้น
SabreWolfy

31

ตามหน้าแหล่งข้อมูลนี้หากความยาวของ x แตกต่างกันเราสามารถใช้:

', '.join(['%.2f']*len(x))

xเพื่อสร้างเจ้าของสถานที่สำหรับองค์ประกอบจากแต่ละรายการ นี่คือตัวอย่าง:

x = [1/3.0, 1/6.0, 0.678]
s = ("elements in the list are ["+', '.join(['%.2f']*len(x))+"]") % tuple(x)
print s
>>> elements in the list are [0.33, 0.17, 0.68]

1
ตอนนี้ลิงค์ตายแล้ว
MK Hunter

19

นี่คือซับเดียว คำตอบชั่วคราวเล็กน้อยโดยใช้รูปแบบพร้อมพิมพ์ () เพื่อวนซ้ำรายการ

แล้วสิ่งนี้ (python 3.x):

sample_list = ['cat', 'dog', 'bunny', 'pig']
print("Your list of animals are: {}, {}, {} and {}".format(*sample_list))

อ่านเอกสารที่นี่ในการใช้รูปแบบ ()


18

เนื่องจากฉันเพิ่งได้เรียนรู้เกี่ยวกับสิ่งที่น่าสนใจนี้ (การจัดทำดัชนีเป็นรายการจากภายในสตริงรูปแบบ) ฉันจึงเพิ่มคำถามเก่านี้

s = '{x[0]} BLAH {x[1]} FOO {x[2]} BAR'
x = ['1', '2', '3']
print (s.format (x=x))

เอาท์พุต:

1 BLAH 2 FOO 3 BAR

อย่างไรก็ตามฉันยังไม่ทราบวิธีการแบ่งส่วน (ภายในสตริงรูปแบบ'"{x[2:4]}".format...) และชอบที่จะคิดออกหากใครมีความคิดอย่างไรก็ตามฉันสงสัยว่าคุณไม่สามารถทำได้


ฉันอยากรู้เล็กน้อยเกี่ยวกับกรณีการใช้งานของคุณสำหรับการหั่น
Michael

1
ฉันไม่มีจริงๆ ... ฉันคิดว่าฉันแค่คิดว่ามันจะเรียบร้อยที่จะทำได้
Joran Beasley

11

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

list_1 = [1,2,3,4,5,6]
list_2 = [1,2,3,4,5,6,7,8]

# Create a function that can apply formatting to lists of any length:
def ListToFormattedString(alist):
    # Create a format spec for each item in the input `alist`.
    # E.g., each item will be right-adjusted, field width=3.
    format_list = ['{:>3}' for item in alist] 

    # Now join the format specs into a single string:
    # E.g., '{:>3}, {:>3}, {:>3}' if the input list has 3 items.
    s = ','.join(format_list)

    # Now unpack the input list `alist` into the format string. Done!
    return s.format(*alist)

# Example output:
>>>ListToFormattedString(list_1)
'  1,  2,  3,  4,  5,  6'
>>>ListToFormattedString(list_2)
'  1,  2,  3,  4,  5,  6,  7,  8'

3

เช่นเดียวกับคำตอบของ @ neobot แต่ทันสมัยและรวบรัดกว่าเล็กน้อย

>>> l = range(5)
>>> " & ".join(["{}"]*len(l)).format(*l)
'0 & 1 & 2 & 3 & 4'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.