Was ist ein effizienter Weg, um eine Zeichenfolge bis zu einer bestimmten Länge zu wiederholen? Z.B:repeat('abc', 7) -> 'abcabca'
Hier ist mein aktueller Code:
def repeat(string, length):
cur, old = 1, string
while len(string) < length:
string += old[cur-1]
cur = (cur+1)%len(old)
return string
Gibt es einen besseren (pythonischeren) Weg, dies zu tun? Vielleicht mit Listenverständnis?
//
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.int()
macht hier das Gleiche, aber ja,//
könnte mikroskopisch schneller sein, weil es die Teilung und den Boden in einem Befehl anstelle von zwei ausführt.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:
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:
Anschließend können Sie es mit einem Array-Slice auf die gewünschte Länge zuschneiden:
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:Welches ist besser? Lassen Sie es uns vergleichen:
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 mitfrom __future__ import division
) verwenden, aber Sie können es trotzdem verwenden.quelle
Das ist ziemlich pythonisch:
quelle
0:7
wenn Sie 7 Zeichen wie OP wollen.quelle
quelle
Vielleicht nicht die effizienteste Lösung, aber sicherlich kurz und einfach:
Gibt "foobarfoobarfo". Eine Sache bei dieser Version ist, dass wenn die Länge <len (Zeichenfolge) ist, die Ausgabezeichenfolge abgeschnitten wird. Beispielsweise:
Gibt "foo".
Bearbeiten: Eigentlich ist dies zu meiner Überraschung schneller als die derzeit akzeptierte Lösung (die Funktion 'repeat_to_length'), zumindest bei kurzen Zeichenfolgen:
Vermutlich würde die Saite
string * length
schlecht funktionieren, wenn sie lang oder sehr lang wäre (dh wenn die Verschwendung des Teils hoch wäre). Und tatsächlich können wir das oben Gesagte ändern, um dies zu überprüfen:quelle
Wie wäre es mit
string * (length / len(string)) + string[0:(length % len(string))]
quelle
length / len(string)
muss in Klammern eingeschlossen sein, und Sie vermissen den letzten]
.//
für die Ganzzahldivision in Python 3 verwenden. Das0
im Spleiß ist optional. (Der Doppelpunkt ist natürlich erforderlich.)ich benutze das:
quelle
Nicht, dass es nicht genügend Antworten auf diese Frage gegeben hätte, aber es gibt eine Wiederholungsfunktion. Sie müssen nur eine Liste erstellen und dann die Ausgabe verbinden:
quelle
"abc", 4
würde erwarten"abca"
. Dies würde schaffenabcabcabcabc
Yay Rekursion!
Skaliert nicht für immer, ist aber für kleinere Saiten in Ordnung. Und es ist hübsch.
Ich gebe zu, ich habe gerade den kleinen Schemer gelesen und ich mag jetzt Rekursion.
quelle
Dies ist eine Möglichkeit, dies mithilfe eines Listenverständnisses zu tun, obwohl es mit zunehmender Länge der
rpt
Zeichenfolge zunehmend verschwenderisch wird .quelle
Ein weiterer FP-Ansatz:
quelle
quelle