PHP's Strtr für Python

PHP hat diestrtr Funktion:

strtr('aa-bb-cc', array('aa' => 'bbz', 'bb' => 'x', 'cc' => 'y'));
# bbz-x-y

Es ersetzt Wörterbuchschlüssel in einer Zeichenfolge durch entsprechende Werte und (wichtig) ersetzt nicht bereits ersetzte Zeichenfolgen. Ein naiver Versuch, dasselbe in Python zu schreiben:

def strtr(strng, replace):
    for s, r in replace.items():
        strng = strng.replace(s, r)
    return strng

strtr('aa-bb-cc', {'aa': 'bbz', 'bb': 'x', 'cc': 'y'})

kehrt zurückxz-x-y was wollen wir nicht (bb wurde wieder ersetzt). Wie ändere ich die obige Funktion so, dass sie sich wie das PHP-Gegenstück verhält?

(Ich würde eine Antwort ohne reguläre Ausdrücke vorziehen, wenn möglich).

Upd: einige tolle Antworten hier. Ich habe sie zeitlich festgelegt und festgestellt, dass Gumbos Version für kurze Saiten die schnellste zu sein scheint, bei längeren Saiten ist der Gewinnerre Lösung:

# 'aa-bb-cc'
0.0258 strtr_thg
0.0274 strtr_gumbo
0.0447 strtr_kojiro
0.0701 strtr_aix

# 'aa-bb-cc'*10
0.1474 strtr_aix
0.2261 strtr_thg
0.2366 strtr_gumbo
0.3226 strtr_kojiro

Meine eigene Version (die leicht Gumbos optimiert ist):

def strtr(strng, replace):
    buf, i = [], 0
    while i < len(strng):
        for s, r in replace.items():
            if strng[i:len(s)+i] == s:
                buf.append(r)
                i += len(s)
                break
        else:
            buf.append(strng[i])
            i += 1
    return ''.join(buf)

Vollständige Codes und Timings:https://gist.github.com/2889181

Antworten auf die Frage(5)

Ihre Antwort auf die Frage