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:
>>> 'abc' * 7
'abcabcabcabcabcabcabc'
Jadi, ulangi string hingga setidaknya sepanjang yang Anda inginkan, Anda menghitung jumlah pengulangan yang tepat dan meletakkannya di sisi kanan operator perkalian:
def repeat_to_at_least_length(s, wanted):
return s * (wanted//len(s) + 1)
>>> repeat_to_at_least_length('abc', 7)
'abcabcabc'
Kemudian, Anda bisa memotongnya ke panjang persis yang Anda inginkan dengan irisan array:
def repeat_to_length(s, wanted):
return (s * (wanted//len(s) + 1))[:wanted]
>>> repeat_to_length('abc', 7)
'abcabca'
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:
def pillmod_repeat_to_length(s, wanted):
a, b = divmod(wanted, len(s))
return s * a + s[:b]
Mana yang lebih baik? Mari kita membandingkannya:
>>> import timeit
>>> timeit.repeat('scheirer_repeat_to_length("abcdefg", 129)', globals=globals())
[0.3964178159367293, 0.32557755894958973, 0.32851039397064596]
>>> timeit.repeat('pillmod_repeat_to_length("abcdefg", 129)', globals=globals())
[0.5276265419088304, 0.46511475392617285, 0.46291469305288047]
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 ada from __future__ import division
) tetapi Anda dapat menggunakannya.
//
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.