Ich habe eine Zeichenfolge, bei der ein Zeichen ('@') durch Zeichen aus einer Liste von einem oder mehreren Zeichen "in der Reihenfolge" und "periodisch" ersetzt werden muss. So habe ich zum Beispiel
'ab@cde@@fghi@jk@lmno@@@p@qrs@tuvwxy@z'
und wollen
'ab1cde23fghi1jk2lmno312p3qrs1tuvwxy2z'
für replace_chars = ['1', '2', '3']
Das Problem ist, dass in diesem Beispiel mehr @ in der Zeichenkette sind als ich Ersatz haben.
Das ist mein Versuch:
%Vor%aber das funktioniert natürlich nur, wenn es nicht mehr als drei @ in der ursprünglichen Zeichenkette gibt und sonst bekomme ich IndexError .
Bearbeiten: Danke für die Antworten!
Ihr Code könnte behoben werden, indem Sie die Zeile i = i%len(replace_chars)
als letzte Zeile Ihrer if
-Klausel hinzufügen. Auf diese Weise nehmen Sie den Rest aus der Division von i
durch die Länge Ihrer Ersatzzeichenliste.
Die kürzere Lösung besteht darin, einen Generator zu verwenden, der Ersatzzeichen periodisch ausspuckt.
%Vor% Für jedes Zeichen c
in Ihrer Zeichenkette s
erhalten wir das nächste Ersatzzeichen aus dem replacer
Generator, wenn das Zeichen ein '@'
ist, andernfalls erhalten Sie nur das ursprüngliche Zeichen.
Für eine Erklärung, warum ich ein Listenverständnis anstelle eines Generatorausdrucks verwendet habe, lesen Sie dies .
Generatoren machen Spaß.
%Vor% Wie PM 2Ring vorgeschlagen hat, ist dies funktional identisch mit itertools.cycle
. Der Unterschied besteht darin, dass itertools.cycle
eine zusätzliche Kopie der Liste im Speicher enthält, die möglicherweise nicht notwendig ist.
itertools.cycle
Quelle:
Sie können auch Ihre Indexlogik beibehalten, wenn Sie modulo verwenden, indem Sie eine Liste comp verwenden, indem Sie itertools.count
verwenden, um zu verfolgen, wo Sie sich befinden:
Tags und Links python python-3.x replace