DEV Community

Cover image for Understanding map, filter, and zip in Python

Understanding map, filter, and zip in Python

Patrick Hanford on December 30, 2019

Understanding map, filter, and zip in Python The purpose of this article is to understand how Python built-in functions map(), filter(),...
Collapse
 
rhymes profile image
rhymes • Edited

I almost never use map or filter but it's good to know how they work. I use list comprehensions all the time though.

A tip: you don't need to call list() on an iterable, unless you have a good reason to (like to print it as an example) you can just... iterate it :)

This is a good intro on "functional Python": Functional Programming HOWTO

Collapse
 
codespent profile image
Patrick Hanford

I predominantly use comprehensions as well, I actually completely forgot you could just iterate the objects so good call! I'm going to update this.

Collapse
 
mbjolnas profile image
Morten

Hi. Sorry I am not very experienced but I spotted a couple of problems in your final bit about zip().

First off you try to iterate over even_numbers without calling list(). I can see others have argued here that list() is not necessary, and I am but a hobby programmer, so I know very little of the deeper layers of programming and maybe I am doing it wrong, but when I try to run the code snippets here, it only works if I call list() on the filter and map returns. Otherwise I get errors in the for loop (does not iterate in the loop without list() on filter, gives a TypeError: 'map' object is not subscriptable.

You set even_numbers_index = 0 and then in the for loop you set squared = even_numbers_squared[even_numbers_index] but you never update even_numbers_index so for each iteration in the loop you keep calling the same index number. When we extend the input list a bit to numbers = [1,2,3,4,5,6,7,8] the result then becomes [(2, 4), (4, 4), (6, 4), (8, 4)] giving an error in output compared to the intended.

It works fine if we use zip() though and skip the for loop: [(2, 4), (4, 16), (6, 36), (8, 64)]

This is just in case others like me come by this otherwise great post to learn about map, filter and zip (and I really mean that. Short and well explained - thanks for that)

Full code I was running:

def even(number):
    if (number % 2) == 0:
        return  True
    return  False

def square(number):
    return number*number

numbers = [1,2,3,4,5,6,7,8]
even_numbers = list(filter(even, numbers))
even_numbers_squared = list(map(square, even_numbers))

combined = []
even_numbers_index = 0
for number in even_numbers:
    squared = even_numbers_squared[even_numbers_index]
    squared_tuple = (number, squared)
    combined.append(squared_tuple)

zipped_result = zip(even_numbers, even_numbers_squared)

print(combined)
print(list(zipped_result))
Enter fullscreen mode Exit fullscreen mode
Collapse
 
codespent profile image
Patrick Hanford

Good catches! Sorry to be late to responding, but I'll make sure to edit these, thank you.

Collapse
 
paddy3118 profile image
Paddy3118 • Edited

But remember, in Python comprehensions should be the first try for what could be done in map and filter.

answer = [(x, x**2) for x in numbers if x % 2 == 0]
Collapse
 
waylonwalker profile image
Waylon Walker

Compressions can typically replace all 3 (map, filter, reduce) and can be used with zip.

The concepts here are still important to know. Libraries like pandas utilize the map syntax, or using a different language like JavaScript.

Collapse
 
codespent profile image
Patrick Hanford

Absolutely, and thanks for commenting this, I hope everyone sees this as well!

Collapse
 
jmmedina00 profile image
Juan Miguel Medina Prieto

I suppose you have to use the list() function on the result these three functions return because that's just an iterable instead of a list, right?

Collapse
 
codespent profile image
Patrick Hanford

Correct. Map, filter, and zip objects are iterables, but we convert to a list for the sake of printing. :)

Collapse
 
falconych profile image
falconych

I am a little bit confused,

def square(number):
return number*number
even_numbers = [2,4]
correct me if I am wrong:
even_numbers_squared should be = [4, 16] instead of [4, 8]

Collapse
 
codespent profile image
Patrick Hanford

Yupp you're correct! Just absent-mindedley added there instead apparently lol.