Tell me more ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

I'm reading through the Python documentation to really get in depth with the Python language and came across the filter and map functions. I have used filter before, but never map, although I have seen both in various Python questions here on SO.

After reading about them in the Python tutorial, I'm confused on the difference between the two. For example, from 5.1.3. Functional Programming Tools:

>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]

and

>>> def cube(x): return x*x*x
...
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

These looked almost exactly the same in function to me, so I went into terminal to run Python interactively and tested out my own case. I used map for both the first and second instances above, and for the first one ( return x % 2 != 0 and x % 3 != 0 ) it returned a list of booleans rather than numbers.

Why does map sometimes return a boolean and other times the actual return value?

Can someone explain to me exactly the difference between map and filter?

share|improve this question

2 Answers

up vote 5 down vote accepted
map(cube, range(1, 11))

is equivalent to

[cube(1), cube(2), ..., cube(10)]

While the list returned by

filter(f, range(2, 25))

is equivalent to result after running

result = []
for i in range(2, 25):
    if f(i):
        result.append(i)

Notice that when using map, the items in the result are values returned by the function cube.

In contrast, the values returned by f in filter(f, ...) are not the items in result. f(i) is only used to determine if the value i should be kept in result.

share|improve this answer

filter(), as its name suggests, filters the original iterable and retents the items that returns True for the function provided to filter().

map() on the other hand, apply the supplied function to each element of the iterable and return a list of results for each element.

Follows the example that you gave, let's compare them:

>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> range(11)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> map(f, range(11)) #the ones that returns TRUE are 1, 5 and 7
[False, True, False, False, False, True, False, True, False, False, False]
>>> filter(f, range(11)) #So, filter returns 1, 5 and 7
[1, 5, 7]
share|improve this answer
 
that makes sense now, i see how the filter term suggests what the function does versus map. –  samrap Sep 22 at 2:23
1  
Actually the name map() makes sense as well, in some field when map is used as a verb it means to find 1 to 1 corresponding relationship. Such as in math: 'map x to y' or in genetics: 'map diabetes to a gene'. One thing nice about Python is just like this: the names often make sense. –  CT Zhu Sep 22 at 2:45
 
that's a good point. It's funny how similar certain aspects of programming are to everyday examples. Like i'm in algebra 2 and we're learning about functions f(x) and half the class is stumped but the idea is 100% similar to functions in programming. –  samrap Sep 22 at 2:54

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.