Ответ Джейсона Шайрера верен, но может использовать еще несколько экспозиций.
Прежде всего, чтобы повторить строку целое число раз, вы можете использовать перегруженное умножение:
>>> '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
), но вы можете использовать его независимо.