Vielleicht nicht die effizienteste Lösung, aber sicherlich kurze & einfach:
def repstr(string, length):
return (string * length)[0:length]
repstr("foobar", 14)
Gibt "foobarfoobarfo". Eine Sache über diese Version ist, dass bei Länge < len (string) dann die Ausgabezeichenfolge abgeschnitten wird. Zum Beispiel:
repstr("foobar", 3)
Gibt "foo".
Edit: tatsächlich zu meiner Überraschung, das ist schneller als die derzeit akzeptierte Lösung (die ‚repeat_to_length‘ -Funktion), zumindest auf kurze Strings:
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
Vermutlich, wenn die Zeichenfolge war lang, oder die Länge war sehr hoch (das heißt, wenn die Verschwendung des string * length
Teils hoch war), dann würde es schlecht funktionieren.Und in der Tat können wir die oben ändern, dies zu überprüfen:
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
so aussieht wird ausgenutzt, Integer übernimmt Aufteilung. Muss das nicht "//" in Python 3 sein? Oder die "+ 1" fallen lassen und ein expliziter Aufruf einer Deckenfunktion wäre ausreichend. Auch eine Anmerkung: Die erzeugte Zeichenfolge hat tatsächlich eine zusätzliche Wiederholung, wenn sie sich gleichmäßig teilt; das Extra wird durch den Spleiß abgeschnitten. Das hat mich zuerst verwirrt. – jpmc26
'int()' macht das gleiche hier, aber yea, '//' könnte mikroskopisch schneller sein, weil es die Division & Floor in einem Befehl statt in zwei durchführt. – Doyousketch2