Native Python function to remove NoneType elements from list?

solvingPuzzles picture solvingPuzzles · Jan 9, 2013 · Viewed 51.6k times · Source

I'm using Beautiful Soup in Python to scrape some data from HTML files. In some cases, Beautiful Soup returns lists that contain both string and NoneType objects. I'd like to filter out all the NoneType objects.

In Python, lists with containing NoneType objects are not iterable, so list comprehension isn't an option for this. Specifically, if I have a list lis containing NoneTypes, and I try to do something like [x for x in lis (some condition/function)], Python throws the error TypeError: argument of type 'NoneType' is not iterable.

As we've seen in other posts, it's straightforward to implement this functionality in a user-defined function. Here's my flavor of it:

def filterNoneType(lis):
    lis2 = []
    for l in links: #filter out NoneType
        if type(l) == str:
            lis2.append(l)
    return lis2

However, I'd love to use a built-in Python function for this if it exists. I always like to simplify my code when possible. Does Python have a built-in function that can remove NoneType objects from lists?

Answer

Abs picture Abs · Jan 9, 2013

I think the cleanest way to do this would be:

#lis = some list with NoneType's
filter(None, lis)