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

Quiero eliminar un valor de una lista si existe en la lista (que no puede).

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

del a[b]
print(a)

Lo anterior da el error:

ValueError: list.index(x): x not in list

Así que 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?

Pregunta hecha hace 13 años, 9 meses, 23 días - Por codecraftsman


11 Respuestas:

  • Para quitar el primera aparición de un elemento, uso list.remove:

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

    Para eliminar todos los casos de un elemento, utilizar un lista de comprensión:

    >>> xs = ['a', 'b', 'c', 'd', 'b', 'b', 'b', 'b']
    >>> xs = [x for x in xs if x != 'b']
    >>> print(xs)
    ['a', 'c', 'd']
    

    Respondida el May 08, 2010 a las 07:54 - por compilerhero

    Votos positivos: 0 | Votos negativos: 0

  • Normalmente Python lanzará una Excepción si le dices que haga algo que no pueda así que tendrás que hacer cualquiera:

    if c in a:
        a.remove(c)
    

    o:

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

    Una Excepción no es necesariamente una cosa mala mientras sea una que esperas y manejas correctamente.

    Respondida el May 08, 2010 a las 07:59 - por codervoyager

    Votos positivos: 0 | Votos negativos: 0

  • Puedes hacerlo

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

    pero por encima de la necesidad de buscar 6 en la lista 2 veces, por lo que tratar excepto sería más rápido

    try:
        a.remove(6)
    except:
        pass
    

    Respondida el May 08, 2010 a las 08:07 - por byteninja8245

    Votos positivos: 0 | Votos negativos: 0

  • Considerar:

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

    Para eliminar todas las ocurrencias, podría utilizar la función de filtro en pitón. Por ejemplo, parecería:

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

    Así que mantendría todos los elementos de a != 2.

    Para simplemente sacar uno de los elementos uso

    a.remove(2)
    

    Respondida el May 08, 2010 a las 08:17 - por codexcrafter

    Votos positivos: 0 | Votos negativos: 0

  • Así es como 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:]
    

    Respondida el May 08, 2010 a las 08:23 - por syntaxsenseie7e4

    Votos positivos: 0 | Votos negativos: 0

  • Como se indica en numerosas otras respuestas, list.remove() funcionará, pero lanzar un ValueError si el artículo no estaba en la lista. Con pitón 3.4+, hay un enfoque interesante para manejar esto, utilizando el suprimir contextmanager:

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

    Respondida el May 08, 2010 a las 08:28 - por logicloom

    Votos positivos: 0 | Votos negativos: 0

  • Si usted sabe qué valor eliminar, aquí es una manera simple (como puedo pensar, de todos modos):

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

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

    Respondida el May 08, 2010 a las 08:35 - por htmlhelix

    Votos positivos: 0 | Votos negativos: 0

  • En una línea:

    a.remove('b') if 'b' in a else None
    

    a veces es útil.

    Incluso más fácil:

    if 'b' in a: a.remove('b')
    

    Respondida el May 08, 2010 a las 08:41 - por codesculptor

    Votos positivos: 0 | Votos negativos: 0

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

    IE si sus datos no se ordenan, y no tienen duplicados, entonces

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

    es libre de errores.

    A menudo una lista es sólo un recipiente práctico para artículos que en realidad no están ordenados. Hay preguntas que preguntan cómo eliminar todas las ocurrencias de un elemento de una lista. Si no quieres los dupes en primer lugar, una vez más un conjunto es útil.

    my_set.add(3)
    

    no cambia mi_set desde arriba.

    Respondida el May 08, 2010 a las 08:50 - por bughunterx

    Votos positivos: 0 | Votos negativos: 0

  • Sí, hay una manera más simple de eliminar un elemento de una lista por valor. Puedes usar el método remove() que elimina la primera aparición del valor dado en la lista. Aquí te muestro cómo puedes hacerlo:

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

    En este caso, si el valor que deseas eliminar no está en la lista, se generará una excepción ValueError, la cual manejamos con un bloque except para que el programa continúe ejecutándose sin interrupciones.

    Respondida el May 09, 2010 a las 07:58 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Sí, hay una forma más sencilla de eliminar un elemento de una lista por valor, utilizando el método remove(). Este método elimina la primera aparición del valor especificado de la lista.

    python
    a = [1, 2, 3, 4]
    a.remove(6)  

    Elimina el número 6 si existe en la lista

    print(a)

    Imprime [1, 2, 3, 4]

    Este método es más simple y eficiente que usar el método index() y del, ya que no requiere que busquemos el índice del elemento antes de eliminarlo. Además, no es necesario utilizar un bloque try/except para manejar el caso en el que el elemento no existe en la lista, ya que el método remove() no lanzará una excepción en ese caso.

    Nota: Si el elemento no existe en la lista, el método remove() lanzará un error ValueError.

    Respondida el May 09, 2010 a las 08:04 - por Gemini

    Votos positivos: 0 | Votos negativos: 0