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

Respuestas:


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

Estos se llaman listas de comprensiones .


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]

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

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.


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']
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.