¿Hay una forma sencilla de eliminar un elemento de la 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  b = a.index(6) 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 sencilla de hacer esto?

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] 

Por lo general, Python lanzará una excepción si le dices que haga algo que no puede, así 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 y cuando sea una que esté esperando y maneje adecuadamente.

Tu puedes hacer

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

pero arriba hay que buscar 6 en la lista 2 veces, así que intente excepto sería más rápido

 try: a.remove(6) except: pass 

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 como:

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

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

Solo para sacar uno de los artículos usa.

 a.remove(2) 

A continuación le indicamos cómo hacerlo in situ (sin comprensión de lista):

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

Si sabe qué valor eliminar, aquí tiene una forma simple (tan 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) 

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

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 tiene 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 apariciones de un elemento de una lista. Si no quieres dupes en primer lugar, una vez más un conjunto es útil.

 my_set.add(3) 

no cambia my_set desde arriba

Como lo indican otras muchas respuestas, list.remove() funcionará, pero arroje un ValueError si el elemento no estaba en la lista. Con Python 3.4+, hay un enfoque interesante para manejar esto, usando el administrador de contexto de supresión :

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

Encontrar un valor en una lista y luego eliminar ese índice (si existe) es más fácil usando el método de eliminación 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 envolverlo en una función:

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

Este ejemplo es rápido y eliminará todas las instancias de un valor de la lista:

 a = [1,2,3,1,2,3,4] while True: try: a.remove(3) except: break print a >>> [1, 2, 1, 2, 4] 

Si sus elementos son distintos, entonces una simple diferencia de conjuntos será suficiente.

 c = [1,2,3,4,'x',8,6,7,'x',9,'x'] z = list(set(c) - set(['x'])) print z [1, 2, 3, 4, 6, 7, 8, 9] 

en una línea:

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

a veces es útil

También podemos usar .pop:

 >>> lst = [23,34,54,45] >>> remove_element = 23 >>> if remove_element in lst: ... lst.pop(lst.index(remove_element)) ... 23 >>> lst [34, 54, 45] >>> 

Sobrescriba la lista indexando todo excepto los elementos que desea eliminar

 >>> s = [5,4,3,2,1] >>> s[0:2] + s[3:] [5, 4, 2, 1] 

Con un bucle for y una condición:

 def cleaner(seq, value): temp = [] for number in seq: if number != value: temp.append(number) return temp 

Y si quieres eliminar algunos, pero no todos:

 def cleaner(seq, value, occ): temp = [] for number in seq: if number == value and occ: occ -= 1 continue else: temp.append(number) return temp 
  list1=[1,2,3,3,4,5,6,1,3,4,5] n=int(input('enter number')) while n in list1: list1.remove(n) print(list1) 

Digamos, por ejemplo, queremos eliminar todos los 1 de x. Así es como lo haría:

 x = [1, 2, 3, 1, 2, 3] 

Ahora, este es un uso práctico de mi método:

 def Function(List, Unwanted): [List.remove(Unwanted) for Item in range(List.count(Unwanted))] return List x = Function(x, 1) print(x) 

Y este es mi método en una sola línea:

 [x.remove(1) for Item in range(x.count(1))] print(x) 

Ambos producen esto como una salida:

 [2, 3, 2, 3, 2, 3] 

Espero que esto ayude. Por favor, tenga en cuenta que esto se escribió en la versión 3.6.2, por lo que es posible que deba ajustarlo para versiones anteriores.

 arr = [1, 1, 3, 4, 5, 2, 4, 3] # to remove first occurence of that element, suppose 3 in this example arr.remove(3) # to remove all occurences of that element, again suppose 3 # use something called list comprehension new_arr = [element for element in arr if element!=3] # if you want to delete a position use "pop" function, suppose # position 4 # the pop function also returns a value removed_element = arr.pop(4) # u can also use "del" to delete a position del arr[4] 

Tal vez sus soluciones funcionan con ints, pero no me funciona con los diccionarios.

En una mano, remove () no me ha funcionado. Pero tal vez funcione con tipos básicos. Supongo que el siguiente código también es la forma de eliminar elementos de la lista de objetos.

Por otro lado, ‘del’ tampoco ha funcionado correctamente. En mi caso, usando python 3.6: cuando bash eliminar un elemento de una lista en un comando ‘for’ bucle with ‘del’, python cambia el índice en el proceso y bucle se detiene antes de tiempo. Solo funciona si elimina elemento por elemento en orden inverso . De este modo, no cambiará el índice de matriz de elementos pendientes cuando lo esté realizando.

Entonces, estoy usando:

 c = len(list)-1 for element in (reversed(list)): if condition(element): del list[c] c -= 1 print(list) 

donde ‘lista’ es como [{‘key1’: value1 ‘}, {‘ key2 ‘: value2}, {‘ key3 ‘: value3}, …]

También puedes hacer más pythonic usando enumerate:

 for i, element in enumerate(reversed(list)): if condition(element): del list[(i+1)*-1] print(list) 

Esto elimina todas las instancias de "-v" de la matriz sys.argv , y no se queja si no se encontraron instancias:

 while "-v" in sys.argv: sys.argv.remove('-v') 

Puede ver el código en acción, en un archivo llamado speechToText.py :

 $ python speechToText.py -v ['speechToText.py'] $ python speechToText.py -x ['speechToText.py', '-x'] $ python speechToText.py -v -v ['speechToText.py'] $ python speechToText.py -v -v -x ['speechToText.py', '-x'] 

syntax: lst.remove(x)

Por ejemplo:

 lst = ['one', 'two', 'three', 'four', 'two'] lst.remove('two') #it will remove first occurence of 'two' in a given list del lst[2] #delete item by index value print(lst) 

Sí. Esto es lo que encontré más útil:

 import sys a = [1, 2, 3, 4] y = 0 if y < 1: a.remove(1) print len(a) else: sys.exit() 

Ahora .remove() solo toma un argumento, por lo que solo puede eliminar un entero de su lista.