Join my Asyncio(Python) course on Udemy 👀

Remove None values from a list in Python

October 18, 2020  ‐ 2 min read

With Python you have multiple options to remove None values from a list. Those options include a basic for loop or by using list comprehension.

A more readable option, by personal opinion, is to use the filter function.

cocktails = ['Mojito', None, 'Pina Colada']

# Remove None values in list
drinks = list(filter(None, cocktails))

print(drinks)
# => ['Mojito', 'Pina Colada']

The filter function takes a function and iterable as parameters, giving it the following signature: filter(function, iterable). And the filter function returns a filter object, so depending on your use-case you might want to cast it to a list again with list().

All elements that in the iterable are passed to the function. If the function returns True for that specific element, that element is kept present. If it returns False, it is filtered out.

If you pass None as the function, the identity function is used instead. This causes all elements that are evaluated as False to be filtered out, so besides None empty strings, 0 and False are too. Which can cause unwanted behavior.

true_and_false = [True, False, None, False, False, True]
true_and_false = list(filter(None, true_and_false))

print(true_and_false)
# => [True, True]

Thus, in the first example passing None as a filter function does suffice. But in our cases you might need to be more explicit when you filter a list, to do you can use list comprehension or write your own callback function.

So the following example uses a lambda function to filter out None values, but it keeps the False's in there as well.

true_and_false = [True, False, None, False, False, True]

# Filter out values with a lambda function
true_and_false = list(filter(lambda x: x is not None, true_and_false))

print(true_and_false)
# => [True, False, False, False, True]

And to include an example using list comprehension as well.

true_and_false = [True, False, None, False, False, True]

# Filter out values with list comprehension
true_and_false = [x for x in true_and_false if x is not None]

print(true_and_false)
# => [True, False, False, False, True]