Відповідь Джейсона Шейрера правильна, але може використати ще одне викладення.
Спочатку, щоб повторити рядок цілим числом разів, ви можете використовувати перевантажене множення:
>>> '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]
Отже, версія таблетки - це щось на кшталт 40% повільніше, що занадто погано, оскільки особисто я думаю, що це набагато читабельніше. Для цього є кілька можливих причин, починаючи з його складання приблизно до 40% більше інструкцій щодо байт-коду.
Примітка: у цих прикладах використовується //
оператор new-ish для обрізання цілого поділу. Це часто називають функцією Python 3, але згідно з PEP 238 , вона була впроваджена ще в Python 2.2. Ви тільки повинні використовувати його в Python 3 (або в модулях , які мають from __future__ import division
) , але ви можете використовувати його в будь-якому випадку .
//
в Python 3? Або скасування+1
та використання явного дзвінка до функції стелі буде достатньо. Також зауважте: створена рядок насправді має додаткове повторення, коли вона ділиться рівномірно; зайвий відрізається зрощенням. Це спочатку мене збентежило.