Bir dizeyi biçimlendirirken aynı değeri birden çok kez ekleme


111

Bu formda bir dizim var

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

Dizedeki tüm% s aynı değere (yani s) sahiptir. Bunu yazmanın daha iyi bir yolu var mı? (Sayfaları üç kez listelemek yerine)



2
Bu %dize operatörü "Python 3.1'de kullanımdan kaldırılacak ve bir süre sonra kaldırılacak" docs.python.org/release/3.0.1/whatsnew/… Şimdi hem sürüm uyumluluğu hem de güvenlik için en çok tavsiye edilen yolun ne olduğunu merak ediyorum.
cregox

2
@Cawas biliyorum çok geç, ama kullanmayı seviyorum str.format(). Örn .: query = "SELECT * FROM {named_arg}"; query.format(**kwargs), burada querybiçim dizesi ve biçim dizesindeki kwargss'lerle eşleşen anahtarlara sahip bir sözlüktür named_arg.
Edwin

4
Evet @Cawas Adam demet gösterim, kullanılan dışında {0}, {1}, {2}ve böylece tekabül ile demet endekslerine 0, 1ve 2sırasıyla. Alternatif olarak, bağımsız değişkenleri adlandırmak (beğenmek {named_arg}) ve her birini format yönteminde ayarlamak da mümkündür , örneğin:'Hi {fname} {lname}!'.format(fname='John', lname='Doe')
Edwin

2
@bignose Her iki soruyu da birbirinin kopyası olarak işaretlediniz google.com/…
abhi

Yanıtlar:


203

Python 2.6 ve Python 3.x'te bulunan gelişmiş dize biçimlendirmesini kullanabilirsiniz :

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

12
~ kişisel tercihim, kwargs tarzı için gitresult = '{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}

Bir anlayış elde etmek için bunu okumak isteyebilirsiniz: Dize Biçimlendirme İşlemleri .


1
Güzel. Bunu unutmuştum. locals () da yapacak.
Goutham

2
@Goutham: Adam Rosenfield'ın cevabı, eğer Python sürümü güncelse daha iyi olabilir.
mhawke

Aslında. Hala yeni dize biçimlendirme işlemlerine alışmaya çalışıyorum.
Goutham

3
daha da iyisi, temel dizeyi çoğaltabilirsiniz: '% (s) s merhaba dünya' * 3% {'s': 'asdad'}
dalloliogm

15

Sözlük biçimlendirme türünü kullanabilirsiniz:

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

1
Bu yinelenen yanıtı sağlamanın çok az anlamı var gibi görünüyor. İşte bir tane daha: '% (string_goes_here) s merhaba dünya% (string_goes_here) s merhaba dünya% (string_goes_here) s'% {'string_goes_here': s,}. Neredeyse sonsuz sayıda olasılık var.
mhawke

3
mhawke: Mesajı tarayıcım sayfayı yeniden yüklemeden önce gönderdim, bu yüzden o anda sorunun zaten yanıtlanmış olduğunu bilmiyordum. Kaba olmana gerek yok !!.
Lucas S.

2
@Lucas: Sanırım cevabınızı yazmanız 13 dakika sürmüş olabilir :) ve olumsuz oy için teşekkürler ... çok takdir ediyorum.
mhawke

13

Daha iyi ile ne demek istediğine bağlı. Bu, amacınız fazlalığı ortadan kaldırmaksa işe yarar.

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

Sanırım sorudaki örnek tekrarlanan 'merhaba dünya' değil, kopyası olmayan gerçek bir şablonla ilgili. Bu yüzden olumsuz oy verdim.
Gra

1

Fstrings

Eğer kullanıyorsanız , biçimlendirilmiş dizeleri temsil Python 3.6+eden yeni adı kullanabilirsiniz f-stringsve bunu fbir f-dizesi olarak tanımlamak için bir dizenin başına karakter ekleyerek kullanılabilir .

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 dizelerini kullanmanın temel faydaları, daha okunaklı olmaları, daha hızlı olmaları ve daha iyi performans sunabilmeleridir:

Herkes için Kaynak Pandalar: Python Veri Analizi, Yazan: Daniel Y. Chen

Deneyler

f-stringsDizeleri yeniden eşleştirmek zorunda olmadığınız için yeninin daha okunabilir olduğuna şüphe yok, ancak yukarıda belirtilen alıntıda belirtildiği gibi daha hızlı mı?

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 Milyon testi çalıştırmak, yeni f-stringsolanların haritalamada aslında daha hızlı olduğu görülüyor .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.