Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use filter, map, and reduce in Python 3

filter, map, and reduce work perfectly in Python 2. Here is an example:

>>> def f(x):         return x % 2 != 0 and x % 3 != 0 >>> filter(f, range(2, 25)) [5, 7, 11, 13, 17, 19, 23]  >>> def cube(x):         return x*x*x >>> map(cube, range(1, 11)) [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]  >>> def add(x,y):         return x+y >>> reduce(add, range(1, 11)) 55 

But in Python 3, I receive the following outputs:

>>> filter(f, range(2, 25)) <filter object at 0x0000000002C14908>  >>> map(cube, range(1, 11)) <map object at 0x0000000002C82B70>  >>> reduce(add, range(1, 11)) Traceback (most recent call last):   File "<pyshell#8>", line 1, in <module>     reduce(add, range(1, 11)) NameError: name 'reduce' is not defined 

I would appreciate if someone could explain to me why this is.

Screenshot of code for further clarity:

IDLE sessions of Python 2 and 3 side-by-side

like image 358
Dick Lucas Avatar asked Nov 30 '12 04:11

Dick Lucas


People also ask

What is the use of map filter and reduce?

map creates a new array by transforming every element in an array individually. filter creates a new array by removing elements that don't belong. reduce , on the other hand, takes all of the elements in an array and reduces them into a single value. Just like map and filter , reduce is defined on Array.

What is the use of map and filter in Python?

map(), filter() and reduce() work in the same way: They each accept a function and a sequence of elements and return the result of applying the received function to each element in the sequence.


1 Answers

You can read about the changes in What's New In Python 3.0. You should read it thoroughly when you move from 2.x to 3.x since a lot has been changed.

The whole answer here are quotes from the documentation.

Views And Iterators Instead Of Lists

Some well-known APIs no longer return lists:

  • [...]
  • map() and filter() return iterators. If you really need a list, a quick fix is e.g. list(map(...)), but a better fix is often to use a list comprehension (especially when the original code uses lambda), or rewriting the code so it doesn’t need a list at all. Particularly tricky is map() invoked for the side effects of the function; the correct transformation is to use a regular for loop (since creating a list would just be wasteful).
  • [...]

Builtins

  • [...]
  • Removed reduce(). Use functools.reduce() if you really need it; however, 99 percent of the time an explicit for loop is more readable.
  • [...]
like image 82
nhahtdh Avatar answered Oct 06 '22 00:10

nhahtdh