Tal vez no sea la solución más eficiente, pero ciertamente corta & simple:
def repstr(string, length):
return (string * length)[0:length]
repstr("foobar", 14)
Da "foobarfoobarfo". Una cosa sobre esta versión es que si la longitud es < len (cadena), la cadena de salida se truncará. Por ejemplo:
repstr("foobar", 3)
Da "foo".
Editar: en realidad, para mi sorpresa, esto es más rápido que la solución actualmente aceptado (la función 'repeat_to_length'), al menos en cadenas cortas:
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
Es de suponer que si la cadena era larga, o la longitud era muy alto (es decir, si el desperdicio de la pieza string * length
fuera alto), no funcionaría bien.Y, de hecho, podemos modificar el anterior para comprobar esto:
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
Parece que esto está tomando ventaja de número entero división. ¿No necesita ser '//' en Python 3? O soltar el '+ 1' y usar una llamada explícita a una función de techo sería suficiente. Además, una nota: la cadena generada en realidad tiene una repetición adicional cuando se divide de manera uniforme; el extra se corta por el empalme. Eso me confundió al principio. – jpmc26
'int()' hace lo mismo aquí, pero sí, '//' podría ser microscópicamente más rápido, porque hace la división y la palabra en un comando en lugar de dos. – Doyousketch2