Buscar y reemplazar valores de cadena en la lista

153

Tengo esta lista:

words = ['how', 'much', 'is[br]', 'the', 'fish[br]', 'no', 'really']

Lo que me gustaría es reemplazar [br]con un valor fantástico similar <br />y obtener así una nueva lista:

words = ['how', 'much', 'is<br />', 'the', 'fish<br />', 'no', 'really']
Eric Herlitz
fuente

Respuestas:

274
words = [w.replace('[br]', '<br />') for w in words]

Estos se llaman listas de comprensiones .

fresa
fuente
55
Al realizar una comparación entre este método de comprensión de la lista y el método del mapa (publicado por @Anthony Kong), este método de la lista fue aproximadamente 2 veces más rápido. También permitió insertar múltiples reemplazos en la misma llamada, por ejemploresname = [name.replace('DA', 'ADE').replace('DC', 'CYT').replace('DG', 'GUA').replace('DT', 'THY') for name in ncp.resname()]
Steven C. Howell el
1
@sberry Tengo una lista ['word STRING', 'word_count BIGINT', 'corpus STRING', 'corpus_date BIGINT']en la que estoy tratando de reemplazar 'con vacío pero esto no funciona. ¿Cómo podemos reemplazar esto usando esto?
Sandeep Singh
¿Qué sucede si uno de los elementos es flotante / entero?
Patriots299
32

Puedes usar, por ejemplo:

words = [word.replace('[br]','<br />') for word in words]
houbysoft
fuente
2
@macetw De hecho, la primera respuesta.
CodeIt
mirando la marca de tiempo parece que ambos respondieron al mismo tiempo, tal vez este
llegue
31

Además de la comprensión de la lista, puedes probar el mapa

>>> map(lambda x: str.replace(x, "[br]", "<br/>"), words)
['how', 'much', 'is<br/>', 'the', 'fish<br/>', 'no', 'really']
Anthony Kong
fuente
15

En caso de que se pregunte sobre el rendimiento de los diferentes enfoques, aquí hay algunos tiempos:

In [1]: words = [str(i) for i in range(10000)]

In [2]: %timeit replaced = [w.replace('1', '<1>') for w in words]
100 loops, best of 3: 2.98 ms per loop

In [3]: %timeit replaced = map(lambda x: str.replace(x, '1', '<1>'), words)
100 loops, best of 3: 5.09 ms per loop

In [4]: %timeit replaced = map(lambda x: x.replace('1', '<1>'), words)
100 loops, best of 3: 4.39 ms per loop

In [5]: import re

In [6]: r = re.compile('1')

In [7]: %timeit replaced = [r.sub('<1>', w) for w in words]
100 loops, best of 3: 6.15 ms per loop

como puede ver para patrones tan simples, la comprensión de la lista aceptada es la más rápida, pero observe lo siguiente:

In [8]: %timeit replaced = [w.replace('1', '<1>').replace('324', '<324>').replace('567', '<567>') for w in words]
100 loops, best of 3: 8.25 ms per loop

In [9]: r = re.compile('(1|324|567)')

In [10]: %timeit replaced = [r.sub('<\1>', w) for w in words]
100 loops, best of 3: 7.87 ms per loop

Esto muestra que para sustituciones más complicadas, un reg-exp precompilado (como en 9-10) puede ser (mucho) más rápido. Realmente depende de su problema y de la parte más corta del reg-exp.

Jörn Hees
fuente
3

Un ejemplo con for loop (prefiero List Comprehensions).

a, b = '[br]', '<br />'
for i, v in enumerate(words):
    if a in v:
        words[i] = v.replace(a, b)
print(words)
# ['how', 'much', 'is<br/>', 'the', 'fish<br/>', 'no', 'really']
Waket Zheng
fuente