Отговорът на Джейсън Шайрър е правилен, но би могъл да използва още малко изложение.
Първо, за да повторите низ цял брой пъти, можете да използвате претоварено умножение:
>>> 'abc' * 7
'abcabcabcabcabcabcabc'
И така, за да повторите низ, докато стане поне толкова дълъг, колкото дължината, която желаете, изчислявате подходящия брой повторения и го поставяте от дясната страна на този оператор за умножение:
def repeat_to_at_least_length(s, wanted):
return s * (wanted//len(s) + 1)
>>> repeat_to_at_least_length('abc', 7)
'abcabcabc'
След това можете да го отрежете до точната дължина, която искате, с резен от масив:
def repeat_to_length(s, wanted):
return (s * (wanted//len(s) + 1))[:wanted]
>>> repeat_to_length('abc', 7)
'abcabca'
Като алтернатива, както се предлага в отговора на pillmod, че вероятно вече никой не превърта достатъчно надолу, за да забележи, можете да използвате divmod
за изчисляване на необходимия брой пълни повторения и броя на допълнителните знаци, всички наведнъж :
def pillmod_repeat_to_length(s, wanted):
a, b = divmod(wanted, len(s))
return s * a + s[:b]
Кое е по добре? Нека го сравним:
>>> 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]
И така, версията на pillmod е около 40% по-бавна, което е много лошо, тъй като лично аз смятам, че е много по-четлива. Има няколко възможни причини за това, като се започне с компилирането му до около 40% повече инструкции за байт код.
Забележка: тези примери използват оператора new-ish //
за съкращаване на целочислено деление. Това често се нарича функция на Python 3, но според PEP 238, беше въведен още в Python 2.2. Вие трябва да го използвате само в Python 3 (или в модули, които имат from __future__ import division
), но можете да го използвате независимо от това.
person
zwol
schedule
02.08.2010