重复string到一定的长度
什么是有效的方式来重复一个string到一定的长度? 例如: 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)的方式来做到这一点? 也许使用列表理解?
def repeat_to_length(string_to_expand, length): return (string_to_expand * ((length/len(string_to_expand))+1))[:length]
重复一个固定次数的string是一个内置的操作:
'abc' * 7
所以,只要计算你需要达到你想要的长度的重复次数,然后把它放在RHS上。 您将需要修剪到正确的长度。
(这似乎是其他答案所做的,但多一点解释似乎有用。)
这是非常pythonic:
newstring = 'abc'*5 print newstring[0:6]
def rep(s, m): a, b = divmod(m, len(s)) return s * a + s[:b]
from itertools import cycle, islice def srepeat(string, n): return ''.join(islice(cycle(string), n))
我使用这个:
def extend_string(s, l): return (s*l)[:l]
不是说这个问题没有足够的答案,而是有一个重复的function; 只需要做一个列表,然后join输出:
from itertools import repeat def rep(s,n): ''.join(list(repeat(s,n))
如何处理string * (length / len(string)) + string[0:(length % len(string))]
Yayrecursion!
def trunc(s,l): if l > 0: return s[:l] + trunc(s, l - len(s)) return ''
不会永远缩放,但是对于较小的string也可以。 而且很漂亮。
我承认我只是读了小Schemer,现在我喜欢recursion。
也许不是最有效的解决scheme,但肯定是简短的:
def repstr(string, length): return (string * length)[0:length] repstr("foobar", 14)
给“foobarfoobarfo”。 关于这个版本的一件事是,如果长度<len(string),那么输出string将被截断。 例如:
repstr("foobar", 3)
给“foo”。
编辑:实际上令我惊讶的是,这比目前接受的解决scheme('repeat_to_length'函数)快,至less在短string:
from timeit import Timer t1 = Timer("repstr('foofoo', 30)", 'from __main__ import repstr') t2 = Timer("repeat_to_length('foofoo', 30)", 'from __main__ import repeat_to_length') t1.timeit() # gives ~0.35 secs t2.timeit() # gives ~0.43 secs
据推测,如果绳子很长,或者绳子的长度很高(就是说string * length
部分很浪费),那么它的performance就会很差。 而实际上我们可以修改上面的来validation这个:
from timeit import Timer t1 = Timer("repstr('foofoo' * 10, 3000)", 'from __main__ import repstr') t2 = Timer("repeat_to_length('foofoo' * 10, 3000)", 'from __main__ import repeat_to_length') t1.timeit() # gives ~18.85 secs t2.timeit() # gives ~1.13 secs
这是一种使用列表理解的方法,尽pipe随着rpt
string的长度增加,它变得越来越浪费。
def repeat(rpt, length): return ''.join([rpt for x in range(0, (len(rpt) % length))])[:length]
另一个FPscheme:
def repeat_string(string_to_repeat, repetitions): return ''.join([ string_to_repeat for n in range(repetitions)])