strtr de php para python

php tiene elstrtr función:

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

Reemplaza las claves del diccionario en una cadena con los valores correspondientes y (importante) no reemplaza las cadenas ya reemplazadas. Un intento ingenuo de escribir lo mismo en python:

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

devolucionesxz-x-y que no es lo que queremosbb fue reemplazado de nuevo). ¿Cómo cambiar la función anterior para que se comporte como su contraparte php?

(Preferiría una respuesta sin expresiones regulares, si es posible).

Actualizaciones: algunas grandes respuestas aquí. Los cronometré y encontré que para cadenas cortas la versión de Gumbo parece ser la más rápida, en cadenas más largas el ganador es elre solución:

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

Mi propia versión (que está ligeramente optimizada de 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)

Códigos y tiempos completos:https://gist.github.com/2889181

Respuestas a la pregunta(5)

Su respuesta a la pregunta