Peut-être pas la solution la plus efficace, mais certainement à court & simple:
def repstr(string, length):
return (string * length)[0:length]
repstr("foobar", 14)
Donne "foobarfoobarfo". Une chose à propos de cette version est que si la longueur < len (chaîne) alors la chaîne de sortie sera tronquée. Par exemple:
repstr("foobar", 3)
Donne "foo".
Edit: en fait à ma grande surprise, c'est plus rapide que la solution actuellement acceptée (la fonction « repeat_to_length »), au moins sur les chaînes courtes:
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
On peut supposer que si la chaîne était longue, ou la longueur était très élevé (c'est-à-dire, si le gaspillage de la partie string * length
était élevé) alors il aurait de mauvaises performances.Et en fait, nous pouvons modifier ce qui précède pour vérifier:
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
On dirait que c'est en profitant du nombre entier division. Cela ne doit-il pas être '//' dans Python 3? Ou abandonner le '+ 1' et utiliser un appel explicite à une fonction de plafond suffirait. Aussi, une note: la chaîne générée a en fait une répétition supplémentaire quand elle se divise uniformément; l'extra est coupé par l'épissure. Cela m'a troublé au début. – jpmc26
'int()' fait la même chose ici, mais oui, '//' peut être microscopiquement plus rapide, parce qu'il fait la division et le plancher dans une commande au lieu de deux. – Doyousketch2