La risposta di Jason Scheirer è corretta ma potrebbe usare qualche altra esposizione.
Prima di tutto, per ripetere una stringa un numero intero di volte, è possibile utilizzare la moltiplicazione sovraccarica:
>>> 'abc' * 7
'abcabcabcabcabcabcabc'
Quindi, per ripetere una stringa fino a quando è lunga almeno quanto la lunghezza desiderata, calcoli il numero appropriato di ripetizioni e lo metti sul lato destro dell'operatore di moltiplicazione:
def repeat_to_at_least_length(s, wanted):
return s * (wanted//len(s) + 1)
>>> repeat_to_at_least_length('abc', 7)
'abcabcabc'
Quindi, puoi tagliarlo alla lunghezza esatta desiderata con una porzione di matrice:
def repeat_to_length(s, wanted):
return (s * (wanted//len(s) + 1))[:wanted]
>>> repeat_to_length('abc', 7)
'abcabca'
In alternativa, come suggerito nella risposta di pillmod che probabilmente nessuno scorre più in basso abbastanza da notare più, puoi usare divmod
per calcolare il numero di ripetizioni complete necessarie e il numero di caratteri extra, tutto in una volta:
def pillmod_repeat_to_length(s, wanted):
a, b = divmod(wanted, len(s))
return s * a + s[:b]
Che è migliore? Facciamo un benchmark:
>>> 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]
Quindi, la versione di pillmod è qualcosa di più lento del 40%, il che è un peccato, dal momento che personalmente penso che sia molto più leggibile. Ci sono diverse possibili ragioni per questo, a partire dalla sua compilazione per circa il 40% in più di istruzioni bytecode.
Nota: questi esempi utilizzano l' //
operatore new-ish per troncare la divisione di numeri interi. Questa è spesso chiamata funzionalità Python 3, ma secondo PEP 238 , è stata introdotta in Python 2.2. È solo necessario per utilizzarlo in Python 3 (o in moduli che hanno from __future__ import division
), ma si può utilizzare a prescindere.
//
in Python 3? Oppure è+1
sufficiente rilasciare e utilizzare una chiamata esplicita a una funzione soffitto. Inoltre, una nota: la stringa generata in realtà ha una ripetizione extra quando si divide uniformemente; l'extra viene tagliato dalla giuntura. Questo all'inizio mi ha confuso.