Python filter() Function Explained
filter() is used to keep only the items that pass a test.
It takes:
- a function that checks each item
- an iterable such as a list, tuple, or string
The result is not a list in Python 3. It returns a filter object, so beginners often convert it with list() to see the values.
Quick example
numbers = [1, 2, 3, 4, 5, 6]
result = filter(lambda x: x % 2 == 0, numbers)
print(list(result)) # [2, 4, 6]
filter() returns a filter object, so beginners often wrap it with list() to see the results.
What filter() does
filter() keeps items that pass a test.
That means:
- each item is checked one at a time
- if the test returns
True, the item is kept - if the test returns
False, the item is removed
Example:
numbers = [1, 2, 3, 4, 5]
result = filter(lambda x: x > 3, numbers)
print(list(result))
Output:
[4, 5]
Here, only numbers greater than 3 are kept.
Syntax and arguments
The syntax is:
filter(function, iterable)
function
This is the test function.
- It receives one item at a time
- It should return
TrueorFalse
iterable
This is the group of values to check.
It can be:
- a list
- a tuple
- a string
- a set
- another iterable object
Example with a tuple:
numbers = (10, 15, 20, 25)
result = filter(lambda x: x >= 20, numbers)
print(list(result))
Output:
[20, 25]
If you are new to iterables, see iterators and iterable objects explained.
What the return value means
In Python 3, filter() returns a filter object.
This is an iterator-like object. You can:
- loop through it
- convert it with
list() - convert it with
tuple()
Example:
result = filter(lambda x: x > 2, [1, 2, 3, 4])
print(result)
print(type(result))
print(list(result))
Output:
<filter object at ...>
<class 'filter'>
[3, 4]
If you print the filter object directly, you will not see the filtered items.
Important: a filter object is consumed as you use it
Once you loop through it or convert it to a list, the items are used up.
result = filter(lambda x: x > 2, [1, 2, 3, 4])
print(list(result))
print(list(result))
Output:
[3, 4]
[]
The second result is empty because the filter object was already consumed.
Using filter() with lambda
A lambda is a short anonymous function.
It is useful for simple filtering rules that fit on one line.
words = ["apple", "kiwi", "banana", "fig"]
result = filter(lambda word: len(word) > 4, words)
print(list(result))
Output:
['apple', 'banana']
This keeps only words with more than 4 characters.
If you want to learn this syntax more clearly, see lambda functions in Python explained.
Using filter() with a named function
A named function is often easier to read than a complex lambda.
This is especially helpful when:
- the logic needs a clear name
- the rule is more than a very short check
- you want beginner-friendly code
def is_even(number):
return number % 2 == 0
numbers = [1, 2, 3, 4, 5, 6]
result = filter(is_even, numbers)
print(list(result))
Output:
[2, 4, 6]
Here, is_even() returns True for even numbers, so those numbers are kept.
Using None with filter()
You can pass None as the first argument:
filter(None, iterable)
In this case, Python removes falsy values.
Falsy values include:
0''(empty string)NoneFalse
Example:
items = [0, 1, "", "hello", None, True, False, 5]
result = filter(None, items)
print(list(result))
Output:
[1, 'hello', True, 5]
This is useful when you want to remove empty or false-like values from data.
When to use filter()
Use filter() when you want to keep only matching items.
It works well for:
- simple filtering rules
- quick data cleaning
- cases where a function already exists for the test
Example:
numbers = [1, 2, 3, 4, 5, 6]
evens = filter(lambda x: x % 2 == 0, numbers)
print(list(evens))
Output:
[2, 4, 6]
For beginners, though, a for loop may be easier to understand.
numbers = [1, 2, 3, 4, 5, 6]
evens = []
for number in numbers:
if number % 2 == 0:
evens.append(number)
print(evens)
Output:
[2, 4, 6]
A list comprehension is also a common alternative:
numbers = [1, 2, 3, 4, 5, 6]
evens = [number for number in numbers if number % 2 == 0]
print(evens)
Output:
[2, 4, 6]
If you want another common filtering style, see list comprehensions in Python explained.
Common mistakes
Here are some common problems beginners run into with filter().
Expecting filter() to return a list
This is the most common mistake.
result = filter(lambda x: x > 2, [1, 2, 3, 4])
print(result)
This prints a filter object, not the values.
Fix:
result = filter(lambda x: x > 2, [1, 2, 3, 4])
print(list(result))
Using a test function that does not return True or False clearly
Your function should make it obvious whether an item should stay.
Good example:
def is_positive(number):
return number > 0
Then use it with:
numbers = [-2, -1, 0, 1, 2]
print(list(filter(is_positive, numbers)))
Output:
[1, 2]
Trying to reuse the same filter object after it has been consumed
A filter object is not stored like a list.
result = filter(lambda x: x > 2, [1, 2, 3, 4])
print(list(result))
print(list(result))
Output:
[3, 4]
[]
If you need to use the values again, convert once and save them:
result = list(filter(lambda x: x > 2, [1, 2, 3, 4]))
print(result)
print(result)
Passing a non-iterable as the second argument
The second argument must be something you can loop over.
Wrong:
# filter(lambda x: x > 2, 10)
This causes an error because 10 is not iterable.
Correct:
print(list(filter(lambda x: x > 2, [1, 2, 3, 4])))
Confusing filter() with map()
filter()keeps or removes itemsmap()changes each item into a new value
Example of filter():
numbers = [1, 2, 3, 4]
print(list(filter(lambda x: x > 2, numbers)))
Output:
[3, 4]
Example of map():
numbers = [1, 2, 3, 4]
print(list(map(lambda x: x * 2, numbers)))
Output:
[2, 4, 6, 8]
For the related function, see Python map() function explained.
FAQ
Does filter() return a list in Python 3?
No. In Python 3, it returns a filter object. Convert it with list() if needed.
What does the function inside filter() need to return?
It should return True to keep an item and False to remove it.
Can I use filter() without lambda?
Yes. You can pass a regular named function.
What does filter(None, items) do?
It removes falsy values such as 0, empty strings, None, and False.
Should I use filter() or a list comprehension?
Both work. Many beginners find list comprehensions or for loops easier to read.
If your goal is simple filtering:
- use
filter()when you already have a test function or want a functional style - use a
forloop when you want the clearest step-by-step logic - use a list comprehension when you want a short and readable result list
For a task-based example, see how to filter a list in Python.