Pregunta ¿Hay una manera simple de eliminar un elemento de lista por valor?


a=[1,2,3,4]
b=a.index(6)
del a[b]
print a

Lo anterior muestra el siguiente error:

Traceback (most recent call last):
  File "D:\zjm_code\a.py", line 6, in <module>
    b=a.index(6)
ValueError: list.index(x): x not in list

Entonces tengo que hacer esto:

a=[1,2,3,4]
try:
    b=a.index(6)
    del a[b]
except:
    pass
print a

¿Pero no hay una manera más simple de hacer esto?


655
2018-05-08 07:48


origen


Respuestas:


Para eliminar la primera aparición de un elemento en una lista, simplemente use list.remove:

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

Tenga en cuenta que no elimina todas las apariciones de su elemento. Use una lista de comprensión para eso.

>>> a = [10, 20, 30, 40, 20, 30, 40, 20, 70, 20]
>>> a = [x for x in a if x != 20]
>>> print a
[10, 30, 40, 30, 40, 70]

1131
2018-05-08 07:56



Normalmente, Python lanzará una Excepción si le dices que haga algo que no puede, por lo que tendrás que hacer lo siguiente:

if c in a:
    a.remove(c)

o:

try:
    a.remove(c)
except ValueError:
    pass

Una excepción no es necesariamente algo malo, siempre que sea una que esperas y manejes adecuadamente.


139
2018-05-08 08:02



Tu puedes hacer

a=[1,2,3,4]
if 6 in a:
    a.remove(6)

pero por encima necesita buscar 6 en la lista un 2 veces, así que intente excepto sería más rápido

try:
    a.remove(6)
except:
    pass

68
2018-05-08 07:57



Considerar:

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

Para eliminar todas las ocurrencias, puede usar la función de filtro en python. Por ejemplo, se vería así:

a = list(filter(lambda x: x!= 2, a))

Entonces, mantendría todos los elementos de a! = 2.

Para sacar uno de los artículos, use

a.remove(2)

39
2017-08-11 19:55



Aquí le mostramos cómo hacerlo en el lugar (sin comprensión de la lista):

def remove_all(seq, value):
    pos = 0
    for item in seq:
        if item != value:
           seq[pos] = item
           pos += 1
    del seq[pos:]

13
2018-05-08 14:57



Si sabes qué valor eliminar, aquí hay una manera simple (tan simple como se me ocurre, de todos modos):

a = [0, 1, 1, 0, 1, 2, 1, 3, 1, 4]
while a.count(1) > 0:
    a.remove(1)

Obtendrás [0, 0, 2, 3, 4]


11
2018-03-28 21:20



Otra posibilidad es usar un conjunto en lugar de una lista, si un conjunto es aplicable en su aplicación.

IE si sus datos no están ordenados, y no tienen duplicados, entonces

my_set=set([3,4,2])
my_set.discard(1)

está libre de errores

A menudo, una lista es solo un contenedor útil para artículos que en realidad no están ordenados. Hay preguntas sobre cómo eliminar todas las ocurrencias de un elemento de una lista. Si no quieres engañar en primer lugar, una vez más, un conjunto es útil.

my_set.add(3)

no cambia my_set desde arriba.


8
2018-03-01 23:13



Encontrar un valor en una lista y luego eliminar ese índice (si existe) es más fácil con solo usar el método remove de la lista:

>>> a = [1, 2, 3, 4]
>>> try:
...   a.remove(6)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 3, 4]
>>> try:
...   a.remove(3)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 4]

Si haces esto a menudo, puedes resumirlo en una función:

def remove_if_exists(L, value):
  try:
    L.remove(value)
  except ValueError:
    pass

7
2018-05-08 07:58



Como se establece en numerosas otras respuestas, list.remove() funcionará, pero arroja un ValueError si el artículo no estaba en la lista. Con Python 3.4+, hay un enfoque interesante para manejar esto, usando el suprimir contextmanager:

from contextlib import suppress
with suppress(ValueError):
    a.remove('b')

6
2017-09-19 11:36