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