Eliminar elemento de lista sin mutación

4 minutos de lectura

avatar de usuario de user3457749
usuario3457749

Suponga que tiene una lista

>>> m = ['a','b','c']

me gustaria hacer una nueva lista n que tiene todo excepto un elemento dado en m (por ejemplo, el elemento 'a'). Sin embargo, cuando uso

>>> m.remove('a')
>>> m
m = ['b', 'c']

la lista original está mutada (el valor 'a' se elimina de la lista original). ¿Hay alguna manera de obtener una nueva lista sans-'a' sin mutar el original? entonces quiero decir que m todavía debería ser [ 'a', 'b', 'c' ]y obtendré un nuevo lista, que tiene que ser [ 'b', 'c' ].

  • ¿Cuál quieres que sea el resultado final? Puede copiar m en una nueva lista con m[:]

    – ben

    28 de julio de 2014 a las 21:06

  • ¿Quiere decir… eliminar algo de una lista sin cambiar la lista? ¿O quiere decir como reemplazar un elemento en una lista con algún tipo de representación nula para que los índices no cambien?

    – Dan Oberlam

    28 de julio de 2014 a las 21:06

  • sí, me refiero a eliminar algo sin cambiar la lista

    – usuario3457749

    28 de julio de 2014 a las 21:11

  • Quiere decir my_var = m[0]?

    – Padraic Cunningham

    28 de julio de 2014 a las 21:24

Avatar de usuario de Krumelur
Krumelur

Supongo que quiere decir que desea crear una nueva lista sin un elemento dado, en lugar de cambiar la lista original. Una forma es usar una lista de comprensión:

m = ['a', 'b', 'c']
n = [x for x in m if x != 'a']

n ahora es una copia de mpero sin el 'a' elemento.

Otra forma sería, por supuesto, copiar la lista primero

m = ['a', 'b', 'c']
n = m[:]
n.remove('a')

Si elimina un valor por índice, es aún más simple

n = m[:index] + m[index+1:]

  • En este caso específico, creo que vale la pena mencionarlo si desea una copia de la lista, excepto el elemento 0 con el que puede dividirlo. m[1:].

    – kyliecatt

    28 de julio de 2014 a las 21:14

  • Es cierto, pero leí la pregunta ya que se desea eliminar un elemento por valor, no por índice. Aún así, ¡un buen punto!

    – Krumelur

    28 de julio de 2014 a las 21:16

  • Solo es útil si sabe con certeza que es el primer elemento de la lista que no desea, pero creo que será útil para futuros lectores para ilustrar cómo funciona el corte de listas.

    – kyliecatt

    28 de julio de 2014 a las 21:17


  • Me gustaría agregar que el primer y segundo enfoque tienen un comportamiento diferente si el valor no es único en la lista. El primero eliminaría todas las ocurrencias del valor, mientras que el segundo solo eliminaría la primera ocurrencia.

    – usuario12205

    31 de agosto de 2018 a las 15:17

Avatar de usuario de 请叫我小马哥
请叫我小马哥

Hay una forma sencilla de hacerlo utilizando la función integrada :filter .

Aquí hay un ejemplo de hacha:

a = [1, 2, 3, 4]
b = filter(lambda x: x != 3, a)

  • Esto es dorado. Ten mi voto a favor. No puedo creer que estaba corriendo list.pop() en un bucle para lograr esto. Mis índices se desordenaron tanto.

    – Bufón

    28 de diciembre de 2022 a las 13:36

Avatar de usuario de Oleg O
Oleg O.

Si el orden no es importante, puede usar set (además, la eliminación parece ser rápida en conjuntos):

list(set(m) - set(['a']))

Sin embargo, esto eliminará los elementos duplicados de su lista original

Avatar de usuario de EHadavi
EHadavi

Podemos hacerlo a través de la función de copia () incorporada para la lista; Sin embargo, debe asignar un nuevo nombre para la copia;

m = ['a','b','c']
m_copy=m.copy()
m_copy.remove('a')

print (m)

[‘a’, ‘b’, ‘c’]

print(m_copy)

[‘b’, ‘c’]

Avatar de usuario de Andrew Johnson
Andrés Johnson

Puede crear una nueva lista sin el elemento ofensivo con una lista de comprensión. Esto preservará el valor de la lista original.

l = ['a', 'b', 'c']
[s for s in l if s != 'a']

avatar de usuario de sigjuice
jugo de sig

Otro enfoque para la comprensión de listas es numpy:

>>> import numpy
>>> a = [1, 2, 3, 4]
>>> list(numpy.remove(a, a.index(3)))
[1, 2, 4]

Avatar de usuario de Suraj Rao
Suraj Rao

Podemos hacerlo sin usar la función de eliminación incorporada y también sin crear una nueva variable de lista

Código:

# List m
m = ['a', 'b', 'c']

# Updated list m, without creating new list variable
m = [x for x in m if x != a]

print(m)

producción

>>> ['b', 'c']

¿Ha sido útil esta solución?