Memasukkan nilai yang sama beberapa kali saat memformat string


111

Saya memiliki untaian formulir ini

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

Semua% s dalam string memiliki nilai yang sama (yaitu s). Apakah ada cara yang lebih baik untuk menulis ini? (Daripada mendaftar tiga kali)



2
%Operator string ini akan "ditinggalkan pada Python 3.1 dan dihapus nanti" docs.python.org/release/3.0.1/whatsnew/… sekarang saya bertanya-tanya cara apa yang paling disarankan untuk kompatibilitas dan keamanan versi.
cregox

2
@Cawas Saya tahu ini cukup terlambat, tapi saya suka menggunakan str.format(). Mis .: query = "SELECT * FROM {named_arg}"; query.format(**kwargs), di mana queryadalah format string dan kwargsmerupakan kamus dengan kunci yang cocok dengan named_args dalam format string.
Edwin

4
@Cawas Ya, kecuali Adam digunakan notasi tuple, di mana {0}, {1}, {2}dan sebagainya sesuai dengan indeks tuple 0, 1dan 2masing-masing. Atau, Anda juga dapat menamai args (like {named_arg}) dan mengaturnya masing-masing dalam metode format, seperti:'Hi {fname} {lname}!'.format(fname='John', lname='Doe')
Edwin

2
@bignose Anda telah menandai kedua pertanyaan sebagai duplikat satu sama lain seperti google.com/…
abhi

Jawaban:


203

Anda dapat menggunakan pemformatan string lanjutan , tersedia di Python 2.6 dan Python 3.x:

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

11
~ preferensi pribadi saya, pilih gaya result = '{st} hello world {st} hello world {st}'.format(st=incoming)
kwargs

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

Anda mungkin ingin membaca ini untuk mendapatkan pemahaman: Operasi Pemformatan String .


1
Bagus. Sudah lupa tentang ini. penduduk lokal () juga akan melakukannya.
Goutham

2
@ Goutham: Jawaban Adam Rosenfield mungkin lebih baik jika Anda versi Python adalah yang terbaru.
mhawke

Ini sebenarnya. Saya masih terbiasa dengan operasi pemformatan string baru.
Goutham

3
Bahkan lebih baik lagi, Anda dapat menggandakan string dasar: '% (s) s hello world' * 3% {'s': 'asdad'}
dalloliogm

15

Anda dapat menggunakan jenis pemformatan kamus:

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

1
Tampaknya tidak ada gunanya memberikan jawaban duplikat ini. Ini satu lagi: '% (string_goes_here) s hello world% (string_goes_here) s hello world% (string_goes_here) s'% {'string_goes_here': s,}. Ada kemungkinan yang tak terbatas jumlahnya.
mhawke

3
mhawke: saya memposting pesan sebelum browser saya memuat ulang halaman jadi saya tidak tahu pada saat itu bahwa pertanyaan itu sudah dijawab. Anda tidak perlu bersikap kasar !!.
Lucas S.

2
@Lucas: Saya rasa Anda mungkin memerlukan waktu 13 menit untuk mengetik jawaban Anda :) dan terima kasih atas suara yang tidak diberikan ... sangat kami hargai.
mhawke

13

Tergantung pada apa yang Anda maksud dengan lebih baik. Ini berfungsi jika tujuan Anda adalah penghapusan redundansi.

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

Saya kira contoh dalam pertanyaan itu bukan tentang 'halo dunia' yang diulang, tetapi template nyata tanpa duplikasi. Itulah mengapa saya tidak memilih.
Gra

1

Fstrings

Jika Anda menggunakan Python 3.6+Anda dapat menggunakan yang baru disebut f-stringsyang merupakan singkatan dari string yang diformat dan dapat digunakan dengan menambahkan karakter fdi awal string untuk mengidentifikasi ini sebagai f-string .

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!

Manfaat utama menggunakan f-string adalah lebih mudah dibaca, lebih cepat, dan menawarkan kinerja yang lebih baik:

Sumber Pandas untuk Semua Orang: Analisis Data Python, Oleh Daniel Y. Chen

Tolak ukur

Tidak diragukan lagi bahwa yang baru f-stringslebih mudah dibaca, karena Anda tidak perlu memetakan ulang stringnya, tetapi apakah itu lebih cepat seperti yang dinyatakan dalam kutipan yang disebutkan?

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

Menjalankan tes 10 Juta tampaknya yang baru f-stringssebenarnya lebih cepat dalam pemetaan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.