Jason Scheirer'in cevabı doğrudur, ancak daha fazla açıklama yapabilir.
Öncelikle, bir dizeyi tamsayı kez tekrarlamak için aşırı yüklenmiş çarpmayı kullanabilirsiniz:
>>> 'abc' * 7
'abcabcabcabcabcabcabc'
Bu nedenle, bir dizeyi en az istediğiniz uzunlukta olana kadar tekrarlamak için , uygun tekrar sayısını hesaplar ve bu çarpma operatörünün sağ tarafına koyarsınız:
def repeat_to_at_least_length(s, wanted):
return s * (wanted//len(s) + 1)
>>> repeat_to_at_least_length('abc', 7)
'abcabcabc'
Ardından, bir dizi dilimi ile tam olarak istediğiniz uzunluğa kırpabilirsiniz:
def repeat_to_length(s, wanted):
return (s * (wanted//len(s) + 1))[:wanted]
>>> repeat_to_length('abc', 7)
'abcabca'
Alternatif olarak, pillmod'un cevabında önerildiği gibi , muhtemelen kimsenin artık fark etmeyecek kadar aşağıya kaymaması , divmod
gereken tam tekrarların sayısını ve ekstra karakterlerin sayısını bir kerede hesaplamak için kullanabilirsiniz :
def pillmod_repeat_to_length(s, wanted):
a, b = divmod(wanted, len(s))
return s * a + s[:b]
Hangisi daha iyi? Bunu kıyaslayalım:
>>> 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]
Yani, pillmod'un versiyonu% 40 daha yavaş bir şey, bu çok kötü, çünkü kişisel olarak çok daha okunabilir olduğunu düşünüyorum. Bunun yaklaşık% 40 daha fazla bayt kodu talimatı derlemesinden başlayarak bunun birkaç olası nedeni vardır.
Not: bu örnekler, //
tamsayı bölünmesini kısaltmak için new-ish operatörünü kullanır. Buna genellikle Python 3 özelliği denir , ancak PEP 238'e göre , Python 2.2'ye kadar geri getirilmiştir. Yalnızca var Python 3'te (veya sahip modüllerde kullanmak için from __future__ import division
), ancak olabilir ne olursa olsun kullanabilirsiniz.
//
Python 3'te olması gerekmez mi? Veya+1
bir tavan işlevine açık bir çağrı bırakmak ve kullanmak yeterli olacaktır. Ayrıca, bir not: oluşturulan dize eşit olarak bölündüğünde ek bir tekrarlamaya sahiptir; ekstra ek yeri tarafından kesilir. Bu beni ilk başta karıştırdı.