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?

filterversión menos elegante :filter(lambda x: x is not None, L)- Podrías deshacerte dellambdausopartialyoperator.is_notcreo, pero probablemente no valga la pena ya que la lista de compilación es mucho más limpia.is_notexistía! Pensé que era solois_, lois_notexista ynot_inque no exista. De hecho, creo quenot_indeberí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.filterfalseo algo dependiendo del caso de usox > yno implicanot x <= yen Python porque puede hacer cualquier cosa__lt__y__le__, entonces, ¿por qué deberíax not in yimplicarnot x in y(especialmente porquenot intiene 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 departialyne?operatormódulo.__ne__?x != yllama 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
lambdalugar: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
Noneentradas.El segundo enfoque pasa por la lista una vez, y luego otra vez cada vez hasta que
Nonese 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 deNoneentradas en el frente, pero el peor de los casos sería si muchasNoneentradas 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,
numpyocythonpuede 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 optimizadanumpyen los últimos años, pero es una habilidad separada. SiLse instancia como unnumpy.arrayPython 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 TrueEsto es equivalente a
Para filtrar Ninguno:
Equivalente a:
Para obtener todos los elementos que evalúan como Falso
fuente