重复字符串至特定长度

2024-04-20 02:04:02 发布

您现在位置:Python中文网/ 问答频道 /正文

什么是将字符串重复到一定长度的有效方法?例如: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

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


Tags: 方法字符串代码列表stringlenreturndef
3条回答
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]

杰森·舍尔的回答是正确的,但还需要更多的解释。

首先,要将字符串重复整数次,可以使用重载乘法:

>>> '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中建议的那样,可能没有人会向下滚动到足以引起注意的程度,您可以使用^{}来计算所需的完整重复次数和额外字符数,所有这些都是同时进行的:

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%的字节码指令开始。

注意:这些示例使用新的ish//运算符来截断整数除法。这通常被称为Python 3特性,但是根据PEP 238,它是在Python 2.2中一路引入的。您只有在Python 3中使用它(或者在具有from __future__ import division的模块中使用它),但是您可以不受限制地使用它。

这是一个很好的Python:

newstring = 'abc'*5
print newstring[0:6]

相关问题 更多 >