Chapter 5
We've done the same processing on each item in the generator expression.
The important difference between the map() function and a generator expression is
that the map() function tends to be faster than the generator expression. The speedup
is in the order of 20 percent less time.
Using map() with multiple sequences
Sometimes, we'll have two collections of data that need to parallel each other. In
Chapter 4, Working with Collections, we saw how the zip() function can interleave
two sequences to create a sequence of pairs. In many cases, we're really trying to do
something like this:
map(function, zip(one_iterable, another_iterable))
We're creating argument tuples from two (or more) parallel iterables and applying a
function to the argument tuple. We can also look at it like this:
(function(x,y) for x,y in zip(one_iterable, another_iterable))
Here, we've replaced the map() function with an equivalent generator expression.
We might have the idea of generalizing the whole thing to this:
def star_map(function, *iterables)
return (function(args) for args in zip(iterables))
There is a better approach that is already available to us. We don't actually need
these techniques. Let's look at a concrete example of the alternate approach.
In Chapter 4, Working with Collections, we looked at trip data that we extracted from
an XML file as a series of waypoints. We needed to create legs from this list of
waypoints that show the start and end of each leg.
The following is a simplified version that uses the zip() function applied to a special
kind of iterable:
waypoints= range(4)
zip(waypoints, waypoints[1:])
<zip object at 0x101a38c20>
list(_)
[(0, 1), (1, 2), (2, 3)]