2016-07-28 11 views
0

Ich möchte string.replace mit for-Schleife verwenden. Dies ist mein Code:Verwenden Sie String.Replace in einem Python für Schleife

new = ['p','q','r'] 
my_str = 'there are two much person a, person b, person c.' 
old = ['a','b','c'] 

for i in range(0,len(old)): 
    my_str = string.replace(my_str,old[i],new[i]) 

print(my_str) 

Aber es gibt mir Fehler:

TypeError: 'str' object cannot be interpreted as an integer

gewünschte Ausgabe:

there are two much person p, person q, person r.

Dies ist nur ein Beispiel, ich möchte eine for-Schleife laufen 10.000 Längenliste.

+2

kann nicht reproduzieren. Ihr Code läuft gut auf Python 2.7 –

+0

Die 'string.replace' Funktion ist seit langer Zeit veraltet. Sie sollten stattdessen die 'tr.replace' Methode verwenden. –

+4

Weißt du, selbst wenn du irgendein seltsames Problem behebst, das du hattest, wirst du immer noch das 'a' in' are' und das 'c' in' viel' ersetzen. – user2357112

Antwort

2

Versuchen

new = ['p','q','r'] 
my_str = 'there are two much person a, person b, person c.' 
old = ['a','b','c'] 

for i in range(len(old)): 
    my_str = my_str.replace(old[i],new[i]) 

print(my_str) 

aber das ist propably nicht sehr schnell

Wenn Einträge in alten sind alle Buchstaben nur für Sie tun können,

import re 

new = ['p','q','r'] 
my_str = 'there are two much person a, person b, person c.' 
old = ['a','b','c'] 

word=re.compile(r"\w*") # word characters 
old_new=dict(zip(old,new)) 
ong=old_new.get 
my_str=word.sub((lambda s:ong(s,s)),my_str) 

print(my_str) 

dies vermeidet auch das Doppel Ersatz Problem, wenn ein Eintrag ist in alt und neu (nicht in der kürzeren Lösung vermieden)

1

string.replace() ist in Python 2.x verfügbar, in Python 3.x jedoch veraltet.

Unten ist, wie Sie es in Python 3.x

str.replace(old, new[, count]) Return a copy of the string with all occurrences of substring old replaced by new. If the optional argument count is given, only the first count occurrences are replaced.

In Ihrem Fall verwenden können, ist es my_str.replace(old[index], new[index])

2

Eigentlich kann ich das Problem nicht reproduzieren; Ihr Code läuft auf Python 2.7 einwandfrei. Es gibt jedoch bessere Möglichkeiten, dies zu tun. Erstens, anstatt eine range zu verwenden, können Sie die old und new Listen zip:

for i in range(0,len(old)): 
    my_str = string.replace(my_str,old[i],new[i]) 

Dies wird jedoch nach wie vor die a in are und die c in much ersetzen, und es könnte auch Zeichen ersetzen, die in eingeführt wurden ein früherer Ersatz, der wahrscheinlich nicht das ist, was Sie wollen. Stattdessen könnten Sie das Modul re verwenden, indem Sie die Zeichenfolgen, die durch | ersetzt werden sollen, mit einer Regex verbinden und sie mit \b Wortgrenzenzeichen, z. \b(a|b|c)\b in Ihrem Fall, und verwenden Sie ein Wörterbuch, um die richtigen Ersetzungen nachzuschlagen.

d = dict(zip(old, new)) 
p = r'\b(' + '|'.join(old) + r')\b' 
my_str = re.sub(p, lambda m: d.get(m.group()), my_str) 

Ergebnis: there are two much person p, person q, person r.

+0

wie meine Lösung funktioniert das nur, wenn Einträge in alt nur aus Wortzeichen bestehen – janbrohl

+0

'.join (alt)' kann keine gute Idee sein, wenn 'len (alt)' 10000 ist. OTOH, das OP kann ein XY Problem haben ... –

+0

@ PM2Ring Guter Punkt, in diesem Licht könnte die Lösung von Janbrohl besser funktionieren. +1 –