Apa cara yang efisien untuk mengulang string ke panjang tertentu? Misalnya:repeat('abc', 7) -> 'abcabca'
Ini kode saya saat ini:
def repeat(string, length):
cur, old = 1, string
while len(string) < length:
string += old[cur-1]
cur = (cur+1)%len(old)
return string
Apakah ada cara yang lebih baik (lebih pythonic) untuk melakukan ini? Mungkin menggunakan pemahaman daftar?
//
dalam Python 3? Atau menjatuhkan+1
dan menggunakan panggilan eksplisit ke fungsi langit-langit sudah cukup. Juga, catatan: string yang dihasilkan sebenarnya memiliki pengulangan ekstra ketika membaginya secara merata; ekstra akan terputus oleh sambungan. Itu membingungkan saya pada awalnya.int()
melakukan hal yang sama di sini, tapi ya,//
mungkin secara mikroskopis lebih cepat, karena ia membagi & lantai dalam satu perintah, bukan dua.Jawaban Jason Scheirer benar tetapi bisa menggunakan penjelasan lebih lanjut.
Pertama, untuk mengulangi string bilangan bulat beberapa kali, Anda dapat menggunakan perkalian yang kelebihan beban:
Jadi, ulangi string hingga setidaknya sepanjang yang Anda inginkan, Anda menghitung jumlah pengulangan yang tepat dan meletakkannya di sisi kanan operator perkalian:
Kemudian, Anda bisa memotongnya ke panjang persis yang Anda inginkan dengan irisan array:
Atau, seperti yang disarankan dalam jawaban pillmod ini yang mungkin gulungan tidak ada turun cukup jauh dengan pemberitahuan lagi, Anda dapat menggunakan
divmod
untuk menghitung jumlah pengulangan penuh dibutuhkan, dan jumlah karakter tambahan, sekaligus:Mana yang lebih baik? Mari kita membandingkannya:
Jadi, versi pillmod kira-kira 40% lebih lambat, yang terlalu buruk, karena secara pribadi saya pikir itu jauh lebih mudah dibaca. Ada beberapa kemungkinan alasan untuk ini, mulai dengan kompilasi hingga sekitar 40% lebih banyak instruksi bytecode.
Catatan: contoh-contoh ini menggunakan
//
operator new-ish untuk memotong divisi integer. Ini sering disebut fitur Python 3, tetapi menurut PEP 238 , itu diperkenalkan sepanjang jalan kembali di Python 2.2. Anda hanya perlu menggunakannya di Python 3 (atau modul yang adafrom __future__ import division
) tetapi Anda dapat menggunakannya.sumber
Ini sangat pythonic:
sumber
0:7
jika Anda ingin 7 karakter seperti OP.sumber
sumber
Mungkin bukan solusi yang paling efisien, tetapi tentu saja singkat & sederhana:
Memberi "foobarfoobarfo". Satu hal tentang versi ini adalah jika panjang <len (string) maka string output akan terpotong. Sebagai contoh:
Memberi "foo".
Sunting: sebenarnya mengejutkan saya, ini lebih cepat daripada solusi yang saat ini diterima (fungsi 'repeat_to_length'), setidaknya pada string pendek:
Agaknya jika tali itu panjang, atau panjangnya sangat tinggi (yaitu, jika pemborosan
string * length
bagian itu tinggi) maka itu akan berkinerja buruk. Dan sebenarnya kita dapat memodifikasi hal di atas untuk memverifikasi ini:sumber
Bagaimana tentang
string * (length / len(string)) + string[0:(length % len(string))]
sumber
length / len(string)
harus menjadi pembungkus dalam tanda kurung, dan Anda melewatkan yang terakhir]
.//
untuk pembagian integer di Python 3. The0
dalam sambatan adalah opsional. (Usus besar diperlukan, tentu saja.)saya menggunakan ini:
sumber
Bukan berarti belum ada jawaban yang cukup untuk pertanyaan ini, tetapi ada fungsi berulang; hanya perlu membuat daftar dan kemudian bergabung dengan output:
sumber
"abc", 4
harapkan"abca"
. Ini akan membuatabcabcabcabc
Rekursi Yay!
Tidak akan skala selamanya, tapi itu bagus untuk string yang lebih kecil. Dan itu cantik.
Saya akui saya baru saja membaca Little Schemer dan saya suka rekursi sekarang.
sumber
Ini adalah salah satu cara untuk melakukannya menggunakan pemahaman daftar, meskipun semakin boros karena panjang
rpt
string meningkat.sumber
Pendekatan FP lain:
sumber
sumber