Jason Scheier 的回答是正确的,但可以使用更多的说明。
首先,要重复一个字符串整数次,可以使用重载乘法:
>>> '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's answer 中所建议的那样,可能没有人向下滚动足够远以至于不再注意到,您可以使用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]
所以,pilmod 的版本慢了 40%,这太糟糕了,因为我个人认为它更具可读性。这有几个可能的原因,首先是编译到大约 40% 的字节码指令。
注意:这些示例使用新的// 运算符来截断整数除法。这通常称为 Python 3 的一个特性,但根据PEP 238,它是在 Python 2.2 中一直引入的。您只有有可以在 Python 3 中使用它(或在具有 from __future__ import division 的模块中),但无论如何您可以使用它。