Die Antwort von Jason Scheirer ist richtig, könnte aber eine weitere Darstellung gebrauchen.
Um eine Zeichenfolge ganzzahlig zu wiederholen, können Sie zunächst die überladene Multiplikation verwenden:
>>> 'abc' * 7
'abcabcabcabcabcabcabc'
Um eine Zeichenfolge zu wiederholen, bis sie mindestens so lang ist wie die gewünschte Länge, berechnen Sie die entsprechende Anzahl von Wiederholungen und setzen sie auf die rechte Seite dieses Multiplikationsoperators:
def repeat_to_at_least_length(s, wanted):
return s * (wanted//len(s) + 1)
>>> repeat_to_at_least_length('abc', 7)
'abcabcabc'
Anschließend können Sie es mit einem Array-Slice auf die gewünschte Länge zuschneiden:
def repeat_to_length(s, wanted):
return (s * (wanted//len(s) + 1))[:wanted]
>>> repeat_to_length('abc', 7)
'abcabca'
Alternativ können Sie, wie in der Antwort von pillmod vorgeschlagen , dass wahrscheinlich niemand mehr weit genug nach unten scrollt, um es zu bemerken, divmod
die Anzahl der erforderlichen vollständigen Wiederholungen und die Anzahl der zusätzlichen Zeichen gleichzeitig berechnen:
def pillmod_repeat_to_length(s, wanted):
a, b = divmod(wanted, len(s))
return s * a + s[:b]
Welches ist besser? Lassen Sie es uns vergleichen:
>>> 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]
Die Version von pillmod ist also ungefähr 40% langsamer, was schade ist, da ich persönlich denke, dass sie viel besser lesbar ist. Es gibt mehrere mögliche Gründe dafür, angefangen beim Kompilieren bis zu etwa 40% mehr Bytecode-Anweisungen.
Hinweis: In diesen Beispielen wird der //
Operator new-ish zum Abschneiden der Ganzzahldivision verwendet. Dies wird oft als Python 3-Funktion bezeichnet, wurde jedoch laut PEP 238 bereits in Python 2.2 eingeführt. Sie müssen es nur in Python 3 (oder in Modulen mit from __future__ import division
) verwenden, aber Sie können es trotzdem verwenden.
//
in Python 3 sein? Oder das Löschen+1
und Verwenden eines expliziten Aufrufs einer Deckenfunktion würde ausreichen. Außerdem ein Hinweis: Die generierte Zeichenfolge hat tatsächlich eine zusätzliche Wiederholung, wenn sie gleichmäßig geteilt wird. Das Extra wird durch den Spleiß abgeschnitten. Das hat mich zuerst verwirrt.