Python filter and lambda - How to select elements with a condition

Python built-in function filter removes some items from a list. The following code is to make a new list from an old list choosing multiples of 3.

a = [1, 2, 3, 4, 5, 6]


def mod(x):
    if x % 3 == 0:
        return True
    else:
        return False


b = filter(mod, a)
c = list(b)

print(b)  # <filter object at 0x10da86280>
print(c)  # [3, 6]

The first argument of filter is a function that usually has if-statement and returns boolean. The second argument is a list.

b is a filter object. filter function returns a filter object and if you want to see all the elements of it, use list to convert a filter object to a list (c).

You can not iterate a filter object

You may think "b is a filter but I can get each value from b for loop". But it's incorrect.

a = [1, 2, 3, 4, 5, 6]


def mod(x):
    if x % 3 == 0:
        return True
    else:
        return False


b = filter(mod, a)
c = list(b)

print(b)  # <filter object at 0x10da86280>
print(c)  # [3, 6]

for v in b:
    print(v)

The last code for v in b: means nonsense and nothing is printed. So to get each item from filtered items, convert a filter object to a list.

A filter object is essentially different from generator.

How to remove None or empty list, set, tuple

filter is often used to remove None or empty list from a list.

a = [3, 5, None, '', {}, ()]

b = filter(None, a)
c = list(b)

print(c)  # [3, 5]

Set the first argument None, filter returns a list (precisely filter object) of "non empty" values.

Filter and lambda

The first argument of filter can be a lambda function.

a = [1, 2, 3, 4, 5, 6, 7]

b = filter(lambda x: x % 3 == 0, a)
c = list(b)

print(c)  # [3, 6]

lambda x: x % 3 == 0 is almost equivalent to mod in the above source and x in lambda iterates in a. x % 3 == 0 returns true or false.

Python List

Python Tutorial