重复字符串到一定长度

新手上路,请多包涵

将字符串重复到一定长度的有效方法是什么?例如: 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的)方法来做到这一点?也许使用列表理解?

原文由 John Howard 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 358
2 个回答
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]

原文由 Jason Scheirer 发布,翻译遵循 CC BY-SA 3.0 许可协议

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 的模块)中使用它,但无论如何您 都可以 使用它。

原文由 zwol 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题