2010-04-06 16 views
140

Tengo que buscar en una lista y reemplazar todas las ocurrencias de un elemento con otro. Hasta ahora mis intentos de código no me llevan a ninguna parte, ¿cuál es la mejor manera de hacer esto?búsqueda y reemplazo de elementos en una lista (python)

Por ejemplo, supongamos que mi lista tiene los siguientes números enteros

>>> a = [1,2,3,4,5,1,2,3,4,5,1] 

y yo tenga que reemplazar todas las ocurrencias del número 1 con el valor 10 para la salida que necesito es

>>> a = [10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10] 

lo tanto mi objetivo es reemplazar todas las instancias del número 1 con el número 10.

+6

¿De qué se trata esto, por cierto? – outis

Respuesta

144
>>> a= [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1] 
>>> for n, i in enumerate(a): 
... if i == 1: 
...  a[n] = 10 
... 
>>> a 
[10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10] 
+2

Esta es una solución mala y muy antiponética. Considere el uso de la lista de comprensión. – AdHominem

+49

Esta es una solución fina, aunque no antiponética. Considere el uso de la lista de comprensión. –

314

Pruebe usar list comprehension y ternary operator.

>>> a=[1,2,3,1,3,2,1,1] 
>>> [4 if x==1 else x for x in a] 
[4, 2, 3, 4, 3, 2, 4, 4] 
+4

Pero esto no cambia 'a' ¿verdad? Creo que OP quería 'a' cambiar – Dula

+4

@Dula puedes hacer a = [4 si x == 1 else x para x en a], esto afectará a –

+0

@Dula: la pregunta es vaga en cuanto a si' a' debería mutar, pero (como muestra Alekhya) es trivial manejar cualquiera de los casos cuando se usa una lista de comprensión. – outis

7
>>> a=[1,2,3,4,5,1,2,3,4,5,1] 
>>> item_to_replace = 1 
>>> replacement_value = 6 
>>> indices_to_replace = [i for i,x in enumerate(a) if x==item_to_replace] 
>>> indices_to_replace 
[0, 5, 10] 
>>> for i in indices_to_replace: 
...  a[i] = replacement_value 
... 
>>> a 
[6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6] 
>>> 
17

Lista comprensión funciona bien - y bucle a través de la enumeración puede ahorrar algo de memoria (b/c de la operación esencialmente estar haciendo en su lugar).

También hay programación funcional ... ver el uso de map:

 
    >>> a = [1,2,3,2,3,4,3,5,6,6,5,4,5,4,3,4,3,2,1] 
    >>> map(lambda x:x if x!= 4 else 'sss',a) 
    [1, 2, 3, 2, 3, 'sss', 3, 5, 6, 6, 5, 'sss', 5, 'sss', 3, 'sss', 3, 2, 1] 
+10

+1. Es una lástima que 'lambda' y 'map' se consideren antiponéticos. – outis

+3

No estoy seguro de que lambda o el mapa sea intrínsecamente antiponético, pero estoy de acuerdo en que la comprensión de la lista es más clara y legible que el uso de los dos conjuntamente. – damzam

+4

No los considero antiponéticos, pero muchos lo hacen, incluido Guido van Rossum (http://www.artima.com/weblogs/viewpost.jsp?thread=98196).Es una de esas cosas sectarias. – outis

6

Si tiene varios valores para reemplazar, también se puede usar un diccionario:

a = [1, 2, 3, 4, 1, 5, 3, 2, 6, 1, 1] 
dic = {1:10, 2:20, 3:'foo'} 

print([dic.get(n, n) for n in a]) 

> [10, 20, 'foo', 4, 10, 5, 'foo', 20, 6, 10, 10] 
+1

¿Esto no arroja un error si 'n' no se encuentra en' dic'? –

+0

Gracias, tienes razón, agregué un bloque try-catch. – roipoussiere

+2

@ user2914540 He mejorado un poco tu respuesta para que funcione si 'n' no se encuentra. Espero que no te moleste. Su solución 'try/except' no era buena. – jrjc

1

La siguiente es una muy método directo en Python 2.x

a = [1,2,3,4,5,1,2,3,4,5,1]  #Replacing every 1 with 10 
for i in xrange(len(a)): 
    if a[i] == 1: 
    a[i] = 10 
print a 

Este método funciona. Los comentarios son bienvenidos Espero que ayude :)

También intente comprender cómo funcionan las soluciones outis's y damzam's. Las compresiones de listas y la función lambda son herramientas útiles.

1
a = [1,2,3,4,5,1,2,3,4,5,1,12] 
for i in range (len(a)): 
    if a[i]==2: 
     a[i]=123 

Puede usar un ciclo for y and while; sin embargo, si conoce la función Enumerate incorporada, entonces se recomienda usar Enumerate. 1

Cuestiones relacionadas