Función nativa de Python para eliminar los elementos NoneType de la lista?
(4)
Creo que la forma más limpia de hacer esto sería:
#lis = some list with NoneType''s
filter(None, lis)
Estoy usando Beautiful Soup in Python para raspar algunos datos de archivos HTML. En algunos casos, Beautiful Soup devuelve listas que contienen objetos de tipo string
y NoneType
. Me gustaría filtrar todos los objetos NoneType
.
En Python, las listas que contienen objetos NoneType
no son iterables, por lo que la comprensión de listas no es una opción para esto. Específicamente, si tengo una lista que contiene NoneTypes
, e intento hacer algo como [x for x in lis (some condition/function)]
, Python lanza el error TypeError: argument of type ''NoneType'' is not iterable
.
Como hemos visto en otras publicaciones , es sencillo implementar esta funcionalidad en una función definida por el usuario. Aquí está mi sabor de ella:
def filterNoneType(lis):
lis2 = []
for l in links: #filter out NoneType
if type(l) == str:
lis2.append(l)
return lis2
Sin embargo, me encantaría usar una función Python incorporada para esto si existe. Siempre me gusta simplificar mi código cuando sea posible. ¿Python tiene una función incorporada que puede eliminar los objetos NoneType
de las listas?
Enumere la comprensión, como otras respuestas propuestas o, en aras de la integridad:
clean = filter(lambda x: x is not None, lis)
Si la lista es enorme, un enfoque de iterador es superior:
from itertools import ifilter
clean = ifilter(lambda x: x is not None, lis)
Puede eliminar fácilmente todos los objetos NoneType
de una lista usando una comprensión de lista:
lis = [i for i in lis if i is not None]
Puedes hacer esto usando la lista de comprensión:
clean = [x for x in lis if x != None]
Como se señaló en los comentarios, también podría usar is not
, incluso si esencialmente se compila en el mismo código de bytes:
clean = [x for x in lis if x is not None]
También puede usar el filter
(nota: esto también filtrará cadenas vacías, si desea más control sobre lo que filtra, puede pasar una función en lugar de None
):
clean = filter(None, lis)
Siempre itertools enfoque de itertools si desea un bucle más eficiente, pero estos enfoques básicos deberían funcionar para la mayoría de los casos cotidianos.