2024-04-20 02:04:02 发布
网友
什么是将字符串重复到一定长度的有效方法?例如:repeat('abc', 7) -> 'abcabca'
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)的方法来做这个?也许用列表理解?
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的模块中使用它),但是您可以不受限制地使用它。
//
from __future__ import division
这是一个很好的Python:
newstring = 'abc'*5 print newstring[0:6]
对于Python3:
杰森·舍尔的回答是正确的,但还需要更多的解释。
首先,要将字符串重复整数次,可以使用重载乘法:
因此,要重复一个字符串,直到它至少到您想要的长度,您可以计算适当的重复次数,并将其放在乘法运算符的右侧:
然后,可以使用数组切片将其修剪为所需的精确长度:
或者,正如pillmod's answer中建议的那样,可能没有人会向下滚动到足以引起注意的程度,您可以使用^{} 来计算所需的完整重复次数和额外字符数,所有这些都是同时进行的:
哪个更好?让我们对它进行基准测试:
所以,pillmod的版本大约慢了40%,这太糟糕了,因为我个人认为它可读性更强。有几个可能的原因,从编译到大约40%的字节码指令开始。
注意:这些示例使用新的ish
//
运算符来截断整数除法。这通常被称为Python 3特性,但是根据PEP 238,它是在Python 2.2中一路引入的。您只有在Python 3中使用它(或者在具有from __future__ import division
的模块中使用它),但是您可以不受限制地使用它。这是一个很好的Python:
相关问题 更多 >
编程相关推荐