重复字符串到一定长度

重复一个字符串到一定长度的有效方法是什么?Eg: repeat('abc', 7) -> 'abcabca'

以下是我目前的代码:

def repeat(string, length):
    cur, old = 1, string
    while len(string) < length:
        string += old[cur-1]
        cur = (cur+1)%len(old)
    return string

有没有更好的(更pythonic的)方法来做这个?也许使用列表理解?

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%。

注意:这些例子使用了新的//操作符来截断整数除法。 这通常被称为Python 3的特性,但根据PEP 238,它早在Python 2.2中就被引入了。 你只需要在Python 3中使用它 (或者在有from __future__ import division的模块中),但你可以使用它。

评论(4)
解决办法
def repeat_to_length(string_to_expand, length):
   return (string_to_expand * ((length/len(string_to_expand))+1))[:length]

对于python3:

def repeat_to_length(string_to_expand, length):
    return (string_to_expand * (int(length/len(string_to_expand))+1))[:length]
评论(2)

那么string * (length / len(string))+ string[0:(length % len(string))]

评论(2)