10.7: Map, filter and reduce
- Page ID
- 41997
To add up all the numbers in a list, you can use a loop like this:
def add_all(t): total = 0 for x in t: total += x return total
total
is initialized to 0. Each time through the loop, x
gets one element from the list. The +=
operator provides a short way to update a variable. This augmented assignment statement,
total += x
is equivalent to
total = total + x
As the loop runs, total
accumulates the sum of the elements; a variable used this way is sometimes called an accumulator.
Adding up the elements of a list is such a common operation that Python provides it as a built-in function, sum
:
>>> t = [1, 2, 3] >>> sum(t) 6
An operation like this that combines a sequence of elements into a single value is sometimes called reduce.
Sometimes you want to traverse one list while building another. For example, the following function takes a list of strings and returns a new list that contains capitalized strings:
def capitalize_all(t): res = [] for s in t: res.append(s.capitalize()) return res
res
is initialized with an empty list; each time through the loop, we append the next element. So res
is another kind of accumulator.
An operation like capitalize_all
is sometimes called a map because it “maps” a function (in this case the method capitalize
) onto each of the elements in a sequence.
Another common operation is to select some of the elements from a list and return a sublist. For example, the following function takes a list of strings and returns a list that contains only the uppercase strings:
def only_upper(t): res = [] for s in t: if s.isupper(): res.append(s) return res
isupper
is a string method that returns True
if the string contains only upper case letters.
An operation like only_upper
is called a filter because it selects some of the elements and filters out the others.
Most common list operations can be expressed as a combination of map, filter and reduce.