重复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随着rptstring的长度增加,它变得越来越浪费。

 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)])