Das ist sehr fragil weil `text` keine Zeichen sondern Bytes enthält, und das Dictionary auch. Wenn man mit Zeichen arbeiten will, insbesondere ausserhalb von ASCII, sollte man sich mit Unicode auseinandersetzen.
Beim Wert zum 'ß' fehlen '&' und ';'.
Bei der Schleife gibt's eigentlich zu allen drei Zeilen etwas zu sagen.
Erstmal die Schleife: Warum muss man sich jedes Zeichen anschauen? Mal angenommen der `text` ist 'äbbä', dann wird die Schleife 4-mal durchlaufen. Beim ersten mal werden alle 'ä' ersetzt, beim 4. mal auch wieder, obwohl gar keine mehr vorhanden sind.
In der ``if``-Abfrage ist der Aufruf von `keys()` nicht nur überflüssig, ``in`` ist auf Dictionaries schon so definiert, das auf Schlüssel getestet wird, sondern es wird für jedes Zeichen im Text eine Liste mit den Schlüsseln erzeugt, linear(!) durchsucht und dann wieder weggeworfen.
Die letzte Zeile ist vertretbar, wenn die äussere Schleife besser wäre, allerdings wird für jedes `replace()` der gesamte Text durchlaufen. Mit `re.sub()` liesse sich das eventuell mit linearer Laufzeit lösen.
Man sollte es mindestens hierauf beschränken:
Code: Alles auswählen
for sonderzeichen, entity in umlaute_codecs.iteritems():
text = text.replace(sonderzeichen, entity)
Der Name `umlaute_codecs` ist nicht ganz passend, da auch ein 'ß' enthalten ist.