Was ist der beste Weg, um "in regelmäßigen Abständen" Zeichen in einer Zeichenfolge in Python zu ersetzen?

8

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!

    
FirimaElda 07.03.2016, 21:28
quelle

4 Antworten

10

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 .

    
timgeb 07.03.2016, 21:31
quelle
6

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:

%Vor%     
Goodies 07.03.2016 21:41
quelle
1

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:

%Vor%     
Padraic Cunningham 07.03.2016 22:07
quelle
0

Ich denke, es ist besser, Zeichen für Zeichen nicht zu iterieren, besonders bei langen Strings mit langen Parts ohne @ .

%Vor%

Ich weiß nicht, wie ich die letzte char [:-1] effizient beenden kann.

    
Sav 11.04.2016 18:48
quelle

Tags und Links