En Python remove()
eliminará la primera aparición de valor en una lista.
¿Cómo eliminar todas las apariciones de un valor de una lista?
Esto es lo que tengo en mente:
>>> remove_values_from_list([1, 2, 3, 4, 2, 2, 3], 2)
[1, 3, 4, 3]
Enfoque funcional:
Python 3.x
>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter((2).__ne__, x))
[1, 3, 3, 4]
o
>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter(lambda a: a != 2, x))
[1, 3, 3, 4]
Python 2.x
>>> x = [1,2,3,2,2,2,3,4]
>>> filter(lambda a: a != 2, x)
[1, 3, 3, 4]
[y for y in x if y != 2]
__ne__
. Comparar dos valores es un proceso mucho más complejo que simplemente llamar__eq__
o__ne__
en uno de ellos. Puede funcionar correctamente aquí porque solo está comparando números, pero en el caso general eso es incorrecto y es un error.Puedes usar una lista de comprensión:
fuente
in
operador como elremove
método escanean la lista completa (hasta encontrar una coincidencia) para que termine escaneando la lista varias veces de esa manera.Puede usar la asignación de divisiones si la lista original debe modificarse, mientras sigue utilizando una comprensión eficiente de la lista (o expresión del generador).
fuente
x = [ v for v in x if x != 2 ]
propuestas, que crean una nueva lista y cambian x para referirse a ella, dejando intacta la lista original.Repetir la solución de la primera publicación de una manera más abstracta:
fuente
x = [1] * 10000 + [2] * 1000
. El cuerpo del bucle se ejecuta 1000 veces y .remove () tiene que omitir 10000 elementos cada vez que se invoca. Eso huele a O (n * n) para mí, pero no es una prueba. Creo que la prueba sería suponer que el número de 2 en la lista es proporcional a su longitud. Ese factor de proporcionalidad luego desaparece en la notación big-O. Sin embargo, el mejor caso de solo un número constante de 2 en la lista no es O (n ^ 2), solo O (2n), que es O (n).Vea la solución simple
Esto devolverá una lista con todos los elementos de
x
sin2
fuente
Todas las respuestas anteriores (aparte de Martin Andersson) crean una nueva lista sin los elementos deseados, en lugar de eliminar los elementos de la lista original.
Esto puede ser importante si tiene otras referencias a la lista dando vueltas.
Para modificar la lista en su lugar, use un método como este
En cuanto a la velocidad, los resultados en mi computadora portátil son (todos en una lista de 5000 entradas con 1000 entradas eliminadas)
Entonces, el ciclo .remove es aproximadamente 100 veces más lento ....... Hmmm, tal vez se necesita un enfoque diferente. Lo más rápido que he encontrado es usar la comprensión de la lista, pero luego reemplazar el contenido de la lista original.
fuente
def remove_all(x, l): return [y for y in l if y != x]
entoncesl = remove_all(3,l)
Puedes hacerlo
fuente
A costa de la legibilidad, creo que esta versión es un poco más rápida ya que no obliga a reexaminar la lista, por lo que hacer exactamente el mismo trabajo que eliminar tiene que hacer de todos modos:
fuente
Enfoque Numpy y tiempos contra una lista / matriz con 1.000.000 elementos:
Tiempos:
Conclusión: numpy es 27 veces más rápido (en mi cuaderno) en comparación con el enfoque de comprensión de la lista
PD: si quieres convertir tu lista de Python normal
lst
en una matriz numpy:Preparar:
Cheque:
fuente
fuente
Para eliminar todas las ocurrencias duplicadas y dejar una en la lista:
Aquí está la función que he usado para el Proyecto Euler:
fuente
Creo que esto es probablemente más rápido que cualquier otra forma si no le importa el orden de las listas, si se preocupa por el pedido final, almacene los índices del original y recurra a eso.
fuente
Mucho más simple, creo.
fuente
Dejar
La solución más simple y eficiente como ya se publicó anteriormente es
Otra posibilidad que debería usar menos memoria pero ser más lenta es
Resultados de tiempo para listas de longitud 1000 y 100000 con entradas coincidentes del 10%: 0,16 frente a 0,25 ms y 23 frente a 123 ms.
fuente
Eliminar todas las apariciones de un valor de una lista de Python
Resultado:
6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11
Alternativamente,
Resultado:
6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11
fuente
Si no tenía incorporado
filter
o no quería usar espacio adicional y necesita una solución lineal ...fuente
['Hola Mundo']
fuente
Acabo de hacer esto para una lista. Solo soy un principiante. Un programador un poco más avanzado seguramente puede escribir una función como esta.
fuente
También podemos eliminar todo en el lugar usando
del
opop
:Ahora para la eficiencia:
Como vemos, la versión in situ
remove_values_from_list()
no requiere memoria adicional, pero lleva mucho más tiempo ejecutarla:fuente
Nadie ha publicado una respuesta óptima para la complejidad del tiempo y el espacio, así que pensé en intentarlo. Aquí hay una solución que elimina todas las apariciones de un valor específico sin crear una nueva matriz y en un tiempo de complejidad eficiente. El inconveniente es que los elementos no mantienen el orden .
Complejidad de tiempo: O (n)
Complejidad de espacio adicional: O (1)
fuente
Sobre la velocidad!
fuente
Solo con Python 3
fuente
Qué hay de malo en:
Usando anaconda
fuente