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]