strp php dla pythona

php mastrtr funkcjonować:

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

Zastępuje klucze słownika w łańcuchu odpowiednimi wartościami i (ważne) nie zastępuje już zastąpionych ciągów. Naiwna próba zapisania tego samego w pythonie:

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'})

zwracaxz-x-y czego nie chcemy (bb został ponownie wymieniony). Jak zmienić powyższą funkcję, aby zachowywała się jak jej odpowiednik php?

(Wolałbym odpowiedź bez wyrażeń regularnych, jeśli to możliwe).

Upd: kilka świetnych odpowiedzi tutaj. Zmierzyłem czas i odkryłem, że w krótkich łańcuchach wersja Gumbo wydaje się najszybsza, a na dłuższych strunach zwycięzcą jestre rozwiązanie:

# '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

Moja własna wersja (która jest nieco zoptymalizowana dla Gumbo):

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)

Pełne kody i czasy:https://gist.github.com/2889181

questionAnswers(5)

yourAnswerToTheQuestion