Ответ Джейсона Шайрера верен, но мог бы использовать еще немного изложения.
Прежде всего, чтобы повторить строку целое число раз, вы можете использовать перегруженное умножение:
>>> '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
), но вы можете использовать его независимо.
//
в Python 3? Или+1
было бы достаточно отбросить и использовать явный вызов функции потолка. Кроме того, примечание: сгенерированная строка на самом деле имеет дополнительное повторение, когда она делится равномерно; лишнее отрезано соединением. Это смутило меня сначала.