HOWTO · Python

Arreglar ValueError: list.remove(x): X Not in List Error en Python

Este tutorial le enseñará a corregir ValueError: list.remove(x): x not in list en Python.

En esta página

ValueError: list.remove(x): x not in list significa que remove() no encontró ningún valor igual al que se pasó. Es posible que la lista haya cambiado desde que la comprobó, que el valor sea distinto de lo esperado o que nunca haya estado presente. list.remove(x) elimina por valor; use del items[index] o items.pop(index) si quiere eliminar un elemento de una posición conocida.

Por qué list.remove(x) provoca ValueError

remove() acepta un valor por llamada y elimina la primera coincidencia. Si la lista contiene valores duplicados, las demás coincidencias permanecen. Por tanto, una segunda llamada para el mismo valor solo tendrá éxito si todavía queda otro valor igual.

Este ejemplo muestra primero una eliminación correcta. La lista se define en el mismo fragmento para que pueda ejecutarlo por separado:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

items = ["science", "maths", "computer", "english"]
items.remove("computer")
print(items)

Después de la primera llamada, "computer" ya no está en items. Si vuelve a llamar a remove() para eliminarlo, se produce ValueError con el mensaje list.remove(x): x not in list. Este ejemplo ejecutable captura el error para que el programa muestre su tipo y mensaje sin terminar:

items = ["science", "maths", "computer", "english"]
items.remove("computer")
try:
    items.remove("computer")
except ValueError as error:
    print(f"{type(error).__name__}: {error}")

El método busca en la lista actual mediante la igualdad. En las cadenas, importan las mayúsculas y los espacios: "Computer" y "computer" son valores distintos. En los objetos personalizados, la igualdad depende de su implementación de __eq__. Si parece que un elemento está presente, pero la eliminación falla, inspeccione la lista justo antes de la llamada y compare el valor y el tipo reales con los que se pasan. Una eliminación anterior, un paso de filtrado o una entrada distinta pueden cambiar la lista entre ambos momentos.

Compruebe si existe un elemento antes de eliminarlo

Si es posible que el valor no esté presente, compruebe si pertenece a la lista antes de llamar a remove(). El operador in también compara mediante la igualdad, así que esta comprobación sigue la misma regla de coincidencia que la eliminación. Al adaptar el patrón, defina juntos la lista y el valor que quiere buscar:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

items = ["science", "maths", "english"]
item = "computer"
if item in items:
    items.remove(item)
print(items)

Si el valor está presente, la llamada protegida elimina su primera coincidencia. Si no está, se omite el bloque y la lista permanece sin cambios. Este enfoque resulta útil cuando es normal que falte el valor y no hace falta hacer nada en ese caso. Si su ausencia indica un error de programación, omitirlo en silencio podría ocultar la causa; valide los datos o gestione el error donde se crea la lista.

La comprobación de pertenencia y la eliminación son operaciones separadas. En código normal de un solo hilo, sin modificaciones entre ambas, se refieren al mismo estado de la lista. Si otra parte del programa puede modificarla entre la comprobación y la llamada, la comprobación por sí sola no garantiza que la eliminación tenga éxito; coordine el acceso o gestione ValueError en la operación que pueda encontrarlo.

Elimine varios elementos de una lista de forma segura

Para eliminar varios valores que sabe que están presentes, llame a remove() una vez por cada valor. El método no acepta una lista de valores en una sola llamada. Este ejemplo independiente elimina dos valores, uno tras otro:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

items = ["science", "maths", "computer", "english"]
items.remove("maths")
items.remove("english")
print(items)

Si tiene una colección de valores que quiere eliminar, recórrala con un bucle. Proteja cada llamada si es posible que falte alguno de los valores solicitados:

items = ["science", "maths", "computer", "english"]
requested = ["maths", "history", "english"]
for item in requested:
    if item in items:
        items.remove(item)
print(items)

Sin la comprobación de pertenencia, el bucle puede detenerse con ValueError al encontrar la primera solicitud cuyo valor no esté presente, y no procesará los valores siguientes. La versión protegida omite las solicitudes de valores ausentes y continúa recorriendo la colección. Ambos patrones modifican la lista original y eliminan una sola coincidencia por solicitud. Si, en cambio, quiere eliminar todos los elementos que cumplan una condición, cree una lista nueva con una comprensión o filtre la lista; las llamadas repetidas a remove() requieren definir expresamente cuántas veces se eliminará y qué contará como coincidencia.

Elija el enfoque que corresponda a sus datos: haga una llamada directa para un valor que sabe que está presente, use una comprobación de pertenencia cuando sea normal que falte y gestione el error explícitamente cuando deba notificarse la ausencia. Si el error le sorprende, compruebe el contenido actual de la lista.