Tengo que buscar en una lista y reemplazar todas las ocurrencias de un elemento con otro. Hasta ahora, mis intentos en el código no me llevan a ninguna parte, ¿cuál es la mejor manera de hacer esto?
Por ejemplo, supongamos que mi lista tiene los siguientes enteros
>>> a = [1,2,3,4,5,1,2,3,4,5,1]
y necesito reemplazar todas las apariciones del número 1 con el valor 10, por lo que la salida que necesito es
>>> a = [10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]
Por lo tanto, mi objetivo es reemplazar todas las instancias del número 1 con el número 10.
Respuestas:
fuente
Intente usar una lista de comprensión y el operador ternario .
fuente
a
¿verdad? Creo que OP queríaa
cambiara
debería mutar, pero (como lo muestra Alekhya) es trivial manejar cualquier caso cuando se utiliza una lista de comprensión.a
, debe hacerloa[:] = [4 if x==1 else x for x in a]
(tenga en cuenta el segmento de la lista completa). Simplemente haciendoa =
esto creará una nueva listaa
con unaid()
(identidad) diferente de la originalLa comprensión de la lista funciona bien, y recorrerla con enumerate puede ahorrarle algo de memoria (b / c, la operación se realiza esencialmente en el lugar).
También hay programación funcional. Ver uso del mapa :
fuente
lambda
ymap
se consideran antifónicos.Si tiene varios valores para reemplazar, también puede usar un diccionario:
fuente
n
no se encuentra endic
?n
no se encuentra. Espero que no te moleste. Tutry/except
solución no fue buena.try-except
es al menos un 50% más rápido! Eche un vistazo a esta respuestaif n in dic.keys()
es malo en cuanto a rendimiento. Usarif n in dic
odic.get(n,n)
(valor predeterminado)fuente
Puede usar un bucle for y or while; sin embargo, si conoce la función incorporada Enumerate, se recomienda usar Enumerate. 1
fuente
Para reemplazar fácilmente a todos
1
con10
ena = [1,2,3,4,5,1,2,3,4,5,1]
uno podría usar la siguiente combinación de una línea lambda + mapa, y 'Look, Ma, no hay FI o de Fors!' :# This substitutes all '1' with '10' in list 'a' and places result in list 'c':
c = list(map(lambda b: b.replace("1","10"), a))
fuente
lambda
elemento de cada lista ...El siguiente es un método muy directo en Python 2.x
Este método funciona Comentarios son bienvenidos Espero eso ayude :)
Prueba también la comprensión de cómo Outis de y de damzam soluciones de trabajo. Las compresiones de listas y la función lambda son herramientas útiles.
fuente
En listas largas y casos raros, su uso es aproximadamente 3 veces más rápido
list.index()
, en comparación con los métodos de iteración de un solo paso presentados en las otras respuestas.fuente
Sé que esta es una pregunta muy antigua y hay muchas formas de hacerlo. El más simple que encontré está usando el
numpy
paquete.fuente
Mi caso de uso estaba reemplazando
None
con algún valor predeterminado.He cronometrado enfoques para este problema que se presentaron aquí, incluido el de @kxr - using
str.count
.Código de prueba en ipython con Python 3.8.1:
Yo obtengo:
Usar el interno
str.index
es, de hecho, más rápido que cualquier comparación manual.No sabía si la excepción en la prueba 4 sería más laboriosa que usarla
str.count
, la diferencia parece insignificante.Tenga en cuenta que
map()
(prueba 6) devuelve un iterador y no una lista real, por lo tanto, la prueba 7.fuente
Simplemente puede usar la comprensión de listas en python:
para su caso, donde desea reemplazar todas las apariciones de 1 por 10, el fragmento de código será así:
fuente
Encuentra y reemplaza solo un artículo
fuente