Encontrar y reemplazar elementos en una lista

Resuelto James asked hace 14 años • 11 respuestas

Tengo que buscar en una lista y reemplazar todas las apariciones de un elemento por otro. Hasta ahora, mis intentos con el código no me llevan a ninguna parte, ¿cuál es la mejor manera de hacerlo?

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 necesito reemplazar todas las apariciones del número 1 con el valor 10, por lo que el resultado que necesito es

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

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

James avatar Apr 06 '10 08:04 James
Aceptado

Intente utilizar una lista por comprensión y una expresión condicional .

>>> 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]
outis avatar Apr 06 '2010 01:04 outis

Puede utilizar el integrado enumeratepara obtener tanto el índice como el valor mientras itera la lista. Luego, use el valor para probar una condición y el índice para reemplazar ese valor en la lista original:

>>> a = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1]
>>> for i, n in enumerate(a):
...   if n == 1:
...      a[i] = 10
...
>>> a
[10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]
ghostdog74 avatar Apr 06 '2010 01:04 ghostdog74

Si tienes varios valores para reemplazar, también puedes usar un diccionario:

a = [1, 2, 3, 4, 1, 5, 3, 2, 6, 1, 1]
replacements = {1:10, 2:20, 3:'foo'}
replacer = replacements.get  # For faster gets.

print([replacer(n, n) for n in a])

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

Tenga en cuenta que este enfoque sólo funciona si los elementos que se van a reemplazar son hash. Esto se debe a que se requiere que las claves de dictado sean hash.

roipoussiere avatar Jul 11 '2016 16:07 roipoussiere

La comprensión de listas funciona bien y realizar un bucle con enumerate puede ahorrarle algo de memoria (porque la operación básicamente se realiza en el lugar).

También hay programación funcional. Ver uso del mapa :

>>> 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]
damzam avatar Apr 06 '2010 03:04 damzam

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.

def list_replace(lst, old=1, new=10):
    """replace list elements (inplace)"""
    i = -1
    try:
        while True:
            i = lst.index(old, i + 1)
            lst[i] = new
    except ValueError:
        pass
kxr avatar Dec 25 '2019 13:12 kxr