¿Cuál es una manera eficiente de repetir una cadena a una determinada longitud? P.ej:repeat('abc', 7) -> 'abcabca'
Aquí está mi código actual:
def repeat(string, length):
cur, old = 1, string
while len(string) < length:
string += old[cur-1]
cur = (cur+1)%len(old)
return string
¿Hay una manera mejor (más pitónica) de hacer esto? Tal vez utilizando la comprensión de la lista?
//
en Python 3? O dejar caer+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 empalme corta el extra. Eso me confundió al principio.int()
hace lo mismo aquí, pero sí,//
puede ser microscópicamente más rápido, porque hace la división y el piso en un comando en lugar de dos.La respuesta de Jason Scheirer es correcta, pero podría usar un poco más de exposición.
En primer lugar, para repetir una cadena un número entero de veces, puede usar la multiplicación sobrecargada:
Entonces, para repetir una cadena hasta que sea al menos tan larga como la longitud que desea, calcule el número apropiado de repeticiones y colóquelo en el lado derecho de ese operador de multiplicación:
Luego, puede recortarlo a la longitud exacta que desee con un segmento de matriz:
Alternativamente, como se sugiere en la respuesta de pillmod de que probablemente nadie se desplaza lo suficiente como para notarlo, puede usar
divmod
para calcular la cantidad de repeticiones completas necesarias y la cantidad de caracteres adicionales, todo a la vez:¿Cual es mejor? Vamos a compararlo:
Entonces, la versión de pillmod es un 40% más lenta, lo cual es una lástima, ya que personalmente creo que es mucho más legible. Hay varias razones posibles para esto, comenzando con la compilación de aproximadamente un 40% más de instrucciones de código de bytes.
Nota: estos ejemplos usan el
//
operador new-ish para truncar la división de enteros. Esto a menudo se llama una característica de Python 3, pero de acuerdo con PEP 238 , se introdujo en Python 2.2. Solo tiene que usarlo en Python 3 (o en módulos que lo tenganfrom __future__ import division
), pero puede usarlo independientemente.fuente
Esto es bastante pitónico:
fuente
0:7
si quieres 7 caracteres como OP.fuente
fuente
Quizás no sea la solución más eficiente, pero ciertamente corta y simple:
Da "foobarfoobarfo". Una cosa sobre esta versión es que si length <len (string) entonces la cadena de salida se truncará. Por ejemplo:
Da "foo".
Editar: para mi sorpresa, esto es más rápido que la solución actualmente aceptada (la función 'repeat_to_length'), al menos en cadenas cortas:
Presumiblemente, si la cuerda era larga, o la longitud era muy alta (es decir, si el desperdicio de la
string * length
pieza era alto), entonces funcionaría mal. Y, de hecho, podemos modificar lo anterior para verificar esto:fuente
Qué tal si
string * (length / len(string)) + string[0:(length % len(string))]
fuente
length / len(string)
debe estar entre paréntesis, y te estás perdiendo el último]
.//
para la división de enteros en Python 3. El0
empalme es opcional. (Se requieren dos puntos, por supuesto).yo uso esto:
fuente
No es que no haya habido suficientes respuestas a esta pregunta, pero hay una función de repetición; solo necesito hacer una lista de y luego unirme a la salida:
fuente
"abc", 4
, esperaría"abca"
. Esto crearíaabcabcabcabc
Yay recursión!
No se escalará para siempre, pero está bien para cadenas más pequeñas. Y es bonito
Admito que acabo de leer Little Schemer y me gusta la recursión en este momento.
fuente
Esta es una forma de hacerlo utilizando una lista de comprensión, aunque es cada vez más derrochador a medida que aumenta la longitud de la
rpt
cadena.fuente
Otro enfoque de FP:
fuente
fuente