การแทรกค่าเดียวกันหลาย ๆ ครั้งเมื่อจัดรูปแบบสตริง


111

ฉันมีสตริงของแบบฟอร์มนี้

s='arbit'
string='%s hello world %s hello world %s' %(s,s,s)

% s ทั้งหมดในสตริงมีค่าเท่ากัน (เช่น s) มีวิธีที่ดีกว่าในการเขียนสิ่งนี้หรือไม่? (แทนที่จะออกรายการสามครั้ง)



2
%ตัวดำเนินการสตริงนี้จะ "เลิกใช้งาน Python 3.1 และนำออกในภายหลัง" docs.python.org/release/3.0.1/whatsnew/…ตอนนี้ฉันสงสัยว่าวิธีใดเป็นวิธีที่แนะนำมากที่สุดสำหรับทั้งความเข้ากันได้และความปลอดภัยของเวอร์ชัน
cregox

2
@Cawas ฉันรู้ว่านี้คือสายสวย str.format()แต่ฉันต้องการใช้ ตัวอย่าง: สตริงรูปแบบอยู่query = "SELECT * FROM {named_arg}"; query.format(**kwargs)ที่ไหนqueryและkwargsเป็นพจนานุกรมที่มีคีย์ตรงกับnamed_args ในสตริงรูปแบบ
Edwin

4
@Cawas ใช่ยกเว้นอดัมใช้สัญกรณ์ tuple ที่{0}, {1}, {2}และอื่น ๆ ที่สอดคล้องกับดัชนี tuple 0, 1และ2ตามลำดับ นอกจากนี้ยังสามารถตั้งชื่อ args (like {named_arg}) และตั้งค่าแต่ละรายการในวิธีการจัดรูปแบบได้เช่น:'Hi {fname} {lname}!'.format(fname='John', lname='Doe')
Edwin

2
@bignose คุณได้ทำเครื่องหมายทั้งสองคำถามซ้ำกันเช่นgoogle.com/…
abhi

คำตอบ:


203

คุณสามารถใช้การจัดรูปแบบสตริงขั้นสูงซึ่งมีอยู่ใน Python 2.6 และ Python 3.x:

incoming = 'arbit'
result = '{0} hello world {0} hello world {0}'.format(incoming)

12
~ ความชอบส่วนตัวเลือกสไตล์ kwargsresult = '{st} hello world {st} hello world {st}'.format(st=incoming)
nehem

40
incoming = 'arbit'
result = '%(s)s hello world %(s)s hello world %(s)s' % {'s': incoming}

คุณอาจต้องการที่จะมีการอ่านนี้จะได้รับความเข้าใจ: String การจัดรูปแบบการดำเนินงาน


1
ดี. ลืมเรื่องนี้ไปแล้ว ชาวบ้าน () จะทำเช่นกัน
Goutham

2
@Goutham: คำตอบของ Adam Rosenfield อาจดีกว่าถ้าคุณเป็นเวอร์ชัน Python ที่ทันสมัย
mhawke

มันเป็นความจริง Iam ยังคงคุ้นเคยกับการดำเนินการจัดรูปแบบสตริงใหม่
Goutham

3
ยิ่งไปกว่านั้นคุณสามารถทวีคูณสตริงฐาน: '% (s) s hello world' * 3% {'s': 'asdad'}
dalloliogm

15

คุณสามารถใช้การจัดรูปแบบประเภทพจนานุกรม:

s='arbit'
string='%(key)s hello world %(key)s hello world %(key)s' % {'key': s,}

1
ดูเหมือนจะเป็นประเด็นน้อยมากในการให้คำตอบที่ซ้ำกันนี้ นี่คืออีกอันหนึ่ง: '% (string_goes_here) s hello world% (string_goes_here) s hello world% (string_goes_here) s'% {'string_goes_here': s,} มีความเป็นไปได้มากมายไม่สิ้นสุด
mhawke

3
mhawke: ฉันโพสต์ข้อความก่อนที่เบราว์เซอร์ของฉันจะโหลดหน้าเว็บซ้ำดังนั้นฉันจึงไม่รู้ว่าแม่นั้นตอบคำถามแล้ว คุณไม่จำเป็นต้องเป็นคนหยาบคาย !!.
Lucas S.

2
@ ลูคัส: ฉันคิดว่าเป็นไปได้ว่าคุณใช้เวลา 13 นาทีในการพิมพ์คำตอบของคุณ :) และขอบคุณสำหรับการโหวตลง ... ชื่นชมมาก
mhawke

13

ขึ้นอยู่กับว่าคุณหมายถึงอะไรดีกว่า วิธีนี้ใช้ได้ผลหากเป้าหมายของคุณคือการกำจัดความซ้ำซ้อน

s='foo'
string='%s bar baz %s bar baz %s bar baz' % (3*(s,))

3
>>> s1 ='arbit'
>>> s2 = 'hello world '.join( [s]*3 )
>>> print s2
arbit hello world arbit hello world arbit

ฉันเดาว่าตัวอย่างในคำถามไม่ได้เกี่ยวกับ 'hello world' ซ้ำ แต่เป็นเทมเพลตจริงที่ไม่มีการทำซ้ำ นั่นเป็นเหตุผลที่ฉันลดคะแนนลง
Gra

1

สตริง

หากคุณกำลังใช้Python 3.6+คุณสามารถทำให้การใช้งานของใหม่ที่เรียกว่าf-stringsซึ่งย่อมาจากสายการจัดรูปแบบและมันสามารถนำมาใช้โดยการเพิ่มตัวละครfที่จุดเริ่มต้นของสตริงเพื่อแจ้งนี้เป็นF-สตริง

price = 123
name = "Jerry"
print(f"{name}!!, {price} is much, isn't {price} a lot? {name}!")
>Jerry!!, 123 is much, isn't 123 a lot? Jerry!

ประโยชน์หลักของการใช้ f-strings คืออ่านได้ง่ายขึ้นเร็วขึ้นและให้ประสิทธิภาพที่ดีขึ้น:

แหล่งที่มาของแพนด้าสำหรับทุกคน: การวิเคราะห์ข้อมูล Python โดย Daniel Y. Chen

เกณฑ์มาตรฐาน

ไม่ต้องสงสัยเลยว่าสิ่งใหม่f-stringsนั้นอ่านได้ง่ายขึ้นเนื่องจากคุณไม่ต้องทำการแมปสตริงใหม่ แต่จะเร็วกว่าตามที่ระบุไว้ในใบเสนอราคาหรือไม่?

price = 123
name = "Jerry"

def new():
    x = f"{name}!!, {price} is much, isn't {price} a lot? {name}!"


def old():
    x = "{1}!!, {0} is much, isn't {0} a lot? {1}!".format(price, name)

import timeit
print(timeit.timeit('new()', setup='from __main__ import new', number=10**7))
print(timeit.timeit('old()', setup='from __main__ import old', number=10**7))
> 3.8741058271543776  #new
> 5.861819514350163   #old

การรันการทดสอบ 10 ล้านครั้งดูเหมือนว่าสิ่งใหม่f-stringsจะเร็วกว่าในการทำแผนที่

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