2016-04-04 4 views
2

Ich habe mit der Codierung von zufälligen Mengen von Zeichenfolgen mit einem Wörterbuch gespielt. Ich habe meinen Code bekommen, um die Buchstaben zu ersetzen, die ich will, aber in einigen Fällen wird er ein Zeichen mehr als einmal ersetzen, wenn ich wirklich nur möchte, dass er den Buchstaben in der Zeichenkette einmal ersetzt. Das ist, was ich habe:Encoder für eine Zeichenfolge - Python

def encode(msg,code): 
    for i in msg: 
     for i in code: 
      msg = msg.replace(i, code[i]) 
     return msg 

für I Testzwecke verwendet die Funktion aufruft: initial:

encode("blagh", {"a":"e","h":"r"}) 

und eine komplexere string:

encode("once upon a time",{'a':'ae','e':'ei','i':'io','o':'ou','u':'ua'}) 

für die zweite rechts oben, suche ich nach der Ausgabe von: 'ouncei uapoun ae tiomei'

sondern sind zu finden, mich mit:

„ounceio uapoun aeio tiomeio“

Wie kann ich meine Schleife begrenzen, um nur einmal jedes Zeichen zu ersetzen?

+0

http://stackoverflow.com/questions/21038891/what-does-table-the-string- Übersetzungsfunktion bedeuten –

Antwort

1

Python 3 ist str.translate Funktion tut, was Sie wollen. Beachten Sie, dass die Übersetzungswörterbuch Unicode ordinals für Schlüssel verwenden müssen, so dass die Funktion ein Wörterbuch Verständnis verwendet sie in das richtige Format zu konvertieren:

def encode(msg,code): 
    code = {ord(k):v for k,v in code.items()} 
    return msg.translate(code) 

print(encode("blagh", {"a":"e","h":"r"})) 
print(encode("once upon a time",{'a':'ae','e':'ei','i':'io','o':'ou','u':'ua'})) 

Ausgang:

blegr 
ouncei uapoun ae tiomei 

Es ist in Python arbeitet 2 als auch wenn Sie Unicode-Strings verwenden oder die folgenden auf den Anfang der Datei in den Strings Unicode standardmäßig zu machen:

from __future__ import unicode_literals 
1

Statt str.replace verwenden, ersetzen Sie Zeichen für Zeichen:

def encode(msg, code): 
    result = '' 
    for ch in msg: 
     result += code.get(ch, ch) 
    return result 

Mit generator expression:

def encode(msg, code): 
    return ''.join(code.get(ch, ch) for ch in msg)