Esta fue mi fuente con la que comencé.
Mi lista
L = [0, 23, 234, 89, None, 0, 35, 9]
Cuando ejecuto esto:
L = filter(None, L)
Obtengo estos resultados
[23, 234, 89, 35, 9]
Pero esto no es lo que necesito, lo que realmente necesito es:
[0, 23, 234, 89, 0, 35, 9]
Porque estoy calculando el percentil de los datos y el 0 hace una gran diferencia.
¿Cómo eliminar el valor None de una lista sin eliminar el valor 0?
filter
versión menos elegante :filter(lambda x: x is not None, L)
- Podrías deshacerte dellambda
usopartial
yoperator.is_not
creo, pero probablemente no valga la pena ya que la lista de compilación es mucho más limpia.is_not
existía! Pensé que era solois_
, lois_not
exista ynot_in
que no exista. De hecho, creo quenot_in
debería convertirse en un método mágico__not_contains__
... veo una pregunta que hice hace un tiempo y un comentario que hice a un respondedor ... y todavía no siento que se haya resuelto.filterfalse
o algo dependiendo del caso de usox > y
no implicanot x <= y
en Python porque puede hacer cualquier cosa__lt__
y__le__
, entonces, ¿por qué deberíax not in y
implicarnot x in y
(especialmente porquenot in
tiene su propioFWIW, Python 3 facilita este problema:
En Python 2, usaría una lista de comprensión en su lugar:
fuente
__ne__
ese tipo en lugar departial
yne
?operator
módulo.__ne__
?x != y
llama internamentex.__ne__(y)
donde ne significa "no igual". Entonces,None.__ne__
es un método enlazado que devuelve True cuando se llama con cualquier valor que no sea None . Por ejemplo,bm = None.__ne__
llamado conbm(10)
retornos NotImplemented que como valor verdadero, ybm(None)
devuelve False .Usando la comprensión de la lista esto se puede hacer de la siguiente manera:
El valor de l es:
fuente
Para Python 2.7 (Ver la respuesta de Raymond, para el equivalente de Python 3):
Queriendo saber si algo "no es Ninguno" es tan común en python (y otros lenguajes OO), que en mi Common.py (que importo a cada módulo con "Importación común *"), incluyo estas líneas:
Luego, para eliminar elementos None de una lista, simplemente haga:
Me resulta más fácil de leer que la comprensión de la lista correspondiente (que Raymond muestra, como su versión de Python 2).
fuente
partial(is_not, None)
esta solución. Creo que esto será más lento (aunque eso no es demasiado importante). Pero con un par de importaciones de módulos de Python, no es necesaria una función personalizada definida en este casoLa respuesta de @jamylak es bastante agradable, sin embargo, si no desea importar un par de módulos solo para hacer esta tarea simple, escriba su propio
lambda
lugar:fuente
[x for x in L if x is not None]
el otro código, fue solo una adición queIteración vs espacio , el uso podría ser un problema. En diferentes situaciones, la elaboración de perfiles puede mostrar que es "más rápida" y / o "menos memoria" intensiva.
El primer enfoque (como también lo sugirieron @jamylak , @Raymond Hettinger y @Dipto ) crea una lista duplicada en la memoria, lo que podría ser costoso para una lista grande con pocas
None
entradas.El segundo enfoque pasa por la lista una vez, y luego otra vez cada vez hasta que
None
se alcanza a. Esto podría consumir menos memoria y la lista se hará más pequeña a medida que avanza. La disminución en el tamaño de la lista podría acelerar una gran cantidad deNone
entradas en el frente, pero el peor de los casos sería si muchasNone
entradas estuvieran en la parte posterior.La paralelización y las técnicas in situ son otros enfoques, pero cada uno tiene sus propias complicaciones en Python. Conocer los datos y los casos de uso de tiempo de ejecución, así como perfilar el programa, es el punto de partida para operaciones intensivas o datos de gran tamaño.
Elegir cualquiera de los enfoques probablemente no importará en situaciones comunes. Se convierte más en una preferencia de notación. De hecho, en esas circunstancias poco comunes,
numpy
ocython
puede ser una alternativa que valga la pena, en lugar de intentar gestionar las optimizaciones de Python.fuente
L.count(None)
y luego está llamando.remove(None)
varias veces, lo que hace que laO(N^2)
situación que está tratando de resolver no se aborde de esta manera, los datos deben reestructurarse en una base de datos o archivo en su lugar si es tan intensivo en memoria.O(n^2)
es solo cuando toda la lista esNone
.numpy
, sería capaz de manejar este tipo de operación de una manera más optimizadanumpy
en los últimos años, pero es una habilidad separada. SiL
se instancia como unnumpy.array
Python en lugar de un Pythonlist
, entoncesL = L[L != numpy.array(None)]
(stackoverflow.com/a/25255015/3003133) es probablemente mejor que cualquiera de los dos, pero no conozco los detalles de implementación para el procesamiento frente a la memoria debajo. Al menos crea una matriz de booleanos de longitud duplicada para la máscara. La sintaxis de una comparación dentro de un operador de acceso (índice), de esa manera, es nueva para mí. Esta discusión también me ha llamado la atencióndtype=object
.fuente
Si se trata de una lista de listas, puede modificar la respuesta de sir @ Raymond
L = [ [None], [123], [None], [151] ] no_none_val = list(filter(None.__ne__, [x[0] for x in L] ) )
para python 2 sin embargono_none_val = [x[0] for x in L if x[0] is not None] """ Both returns [123, 151]"""
<< list_indice [0] para la variable en Lista si la variable no es Ninguna >>
fuente
Digamos que la lista es como abajo
Esto devolverá solo aquellos artículos cuyo
bool(item) is True
Esto es equivalente a
Para filtrar Ninguno:
Equivalente a:
Para obtener todos los elementos que evalúan como Falso
fuente