Búsqueda / reemplazo iterativo de una lista de tuplas en Python

Tengo una lista de tuplas, cada una con un valor de buscar / reemplazar que me gustaría aplicar a una cadena. ¿Cuál sería la forma más eficiente de hacerlo? Aplicaré esto de manera iterativa, por lo que el rendimiento es mi mayor preocupación.

Más concretamente, ¿qué aspecto tendrían las entrañas del proceso ()?

x = 'find1, find2, find3' y = [('find1', 'replace1'), ('find2', 'replace2'), ('find3', 'replace3')] def processThis(str,lst): # Do something here return something >>> processThis(x,y) 'replace1, replace2, replace3' 

¡Gracias a todos!

Podría considerar usar re.sub :

 import re REPLACEMENTS = dict([('find1', 'replace1'), ('find2', 'replace2'), ('find3', 'replace3')]) def replacer(m): return REPLACEMENTS[m.group(0)] x = 'find1, find2, find3' r = re.compile('|'.join(REPLACEMENTS.keys())) print r.sub(replacer, x) 

Un par de notas:

  1. El argumento repetitivo sobre la optimización prematura, la evaluación comparativa, los cuellos de botella, 100 es pequeño, etc.
  2. Hay casos donde las diferentes soluciones devolverán diferentes resultados. si y = [('one', 'two'), ('two', 'three')] y x = 'one' entonces la solución de mhawke te da 'two' y Unknown’s da 'three' .
  3. Probando esto en un ejemplo ingenioso, la solución de mhawke fue un poco más rápida. Sin embargo, debería ser fácil probarlo con tus datos.
 x = 'find1, find2, find3' y = [('find1', 'replace1'), ('find2', 'replace2'), ('find3', 'replace3')] def processThis(str,lst): for find, replace in lst: str = str.replace(find, replace) return str >>> processThis(x,y) 'replace1, replace2, replace3' 
 s = reduce(lambda x, repl: str.replace(x, *repl), lst, s) 

La misma respuesta que mhawke, incluida con el método str_replace

 def str_replace(data, search_n_replace_dict): import re REPLACEMENTS = search_n_replace_dict def replacer(m): return REPLACEMENTS[m.group(0)] r = re.compile('|'.join(REPLACEMENTS.keys())) return r.sub(replacer, data) 

Entonces podemos llamar a este método con el siguiente ejemplo.

 s = "abcd abcd efgh efgh;;;;;; lkmnkd kkkkk" d = dict({ 'abcd' : 'aaaa', 'efgh' : 'eeee', 'mnkd' : 'mmmm' }) print (s) print ("\n") print(str_replace(s, d)) 

salida:

 abcd abcd efgh efgh;;;;;; lkmnkd kkkkk aaaa aaaa eeee eeee;;;;;; lkmmmm kkkkk