php ha la funzione strtr
:di php per pitone
strtr('aa-bb-cc', array('aa' => 'bbz', 'bb' => 'x', 'cc' => 'y'));
# bbz-x-y
sostituisce chiavi del dizionario in una stringa con valori corrispondenti e (importante) non sostituisce già sostituito stringhe. Un tentativo ingenuo di scrivere lo stesso in pitone:
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'})
rendimenti xz-x-y
che non vogliamo è (bb
ha fatto ancora una volta sostituito). Come cambiare la funzione sopra in modo che si comporti come la sua controparte php?
(Preferirei una risposta senza espressioni regolari, se possibile).
Aggiornamento: alcune grandi risposte qui. Li ho cronometrato e ha scoperto che per brevi stringhe la versione di Gumbo sembra essere il più veloce, in stringhe più lunghe il vincitore è la soluzione re
:
# '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
mia versione (che è leggermente ottimizzato Gumbo di):
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)
codici e tempi completi: https://gist.github.com/2889181
Ci mancano entrambi (dallo strtr doc): le chiavi più lunghe verranno provate prima. –
Grazie, funziona bene (tranne che per l'errore di battitura). – georg