Jason Scheirer的答案是正确的,但需要更多的阐述。
首先,要将一个字符串重复整数次,你可以使用重载乘法:
>>> '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中引入的。你只需要在python3中使用它(或在有__future__导入除法的模块中),但你可以无论如何使用它。