23.5. Zip¶
One more common pattern with lists, besides accumulation, is to step through a pair of lists (or several lists), doing something with all of the first items, then something with all of the second items, and so on. For example, given two lists of numbers, you might like to add them up pairwise, taking [3, 4, 5] and [1, 2, 3] to yield [4, 6, 8].
One way to do that with a for loop is to loop through the possible index values.
You have seen this idea previously for iterating through the items in a single list. In many other programming languages that’s really the only way to iterate through the items in a list. In Python, however, we have gotten used to the for loop where the iteration variable is bound successively to each item in the list, rather than just to a number that’s used as a position or index into the list.
Can’t we do something similar with pairs of lists? It turns out we can.
The zip
function takes multiple lists and turns them into a list of tuples (actually, an iterator, but they work like
lists for most practical purposes), pairing up all the first items as one tuple, all the second items as a tuple, and so
on. Then we can iterate through those tuples, and perform some operation on all the first items, all the second items, and
so on.
Here’s what happens when you loop through the tuples.
Or, simplifying and using a list comprehension:
Or, using map
and not unpacking the tuple (our online environment has trouble with unpacking the tuple in a lambda expression):
Consider a function called possible, which determines whether a word is still possible to play in a game of hangman, given the guesses that have been made and the current state of the blanked word.
Below we provide function that fulfills that purpose.
However, we can rewrite that using zip
, to be a little more comprehensible.
Check Your Understanding
1. Below we have provided two lists of numbers, L1
and L2
. Using zip and list comprehension, create a new list, L3
, that sums the two numbers if the number from L1
is greater than 10 and the number from L2
is less than 5. This can be accomplished in one line of code.