How To Use the Python Zip Function for Multiple Iteration
The Python zip
function is an important tool that makes it easy to group data from multiple data structures. It is commonly used to loops over multiple data structures at once, without having to create nested loops.
In this tutorial, I will show you how to use the Python zip
function to perform multiple iterations over parallel data structures.
Table of Contents
You can skip to a specific section of this tutorial below:
- What is the Python
zip
Function? - How to Use the Python
zip
Function With Different Data Structures - How to Use the Python
zip
Function With More Than Two Arguments - How the Python
zip
Function Handles Arguments of Different Length - How To Loop Over Multiple Objects in Python Using Python
zip
- Final Thoughts
What is the Python zip
Function?
The Python zip
function is used to merge multiple objects, called iterables
. More specifically, it creates a new object whose elements are tuples. Within a specific tuple, the elements of the iterables are held.
A simple example is helpful to understand the Python zip
function. Imagine that you have two Python tuples of names, like this:
a = ("Nick", "Cheryl", "Jim")
b = ("Joseph", "John", "Kyle")
If you wanted to easily pair together the specific entries of the two tuples, the zip
function is the perfect solution. Here's what this loops like:
zip(a,b)
You'll notice that this returns a special zip
object, so the output of this code will look like this:
<zip at 0x10ca43640>
To transform this zip
object into a human-readable format, you can use one of Python's built-in data structure functions.
As an example, here's how we could transform this zip
object into a Python list:
list(zip(a,b))
This returns:
[('Nick', 'Joseph'), ('Cheryl', 'John'), ('Jim', 'Kyle')]
There are many more specifics to the zip
function, but that's its high-level overview.
If you are interested in the technical details, here is the official definition of the Python zip
function from the official Python documentation website:
Returns an iterator of tuples, where the i-th tuple contains the i-th element from each of the argument sequences or iterables. The iterator stops when the shortest input iterable is exhausted. With a single iterable argument, it returns an iterator of 1-tuples. With no arguments, it returns an empty iterator.
More information can be found in the official documentation on the Python zip
function here.
For anyone who wants to see the source code of the Python zip
function, the language's maintainers have provided it on the documentation website. Here is the source code for the Python zip
function:
def zip(*iterables):
# zip('ABCD', 'xy') --> Ax By
sentinel = object()
iterators = [iter(it) for it in iterables]
while iterators:
result = []
for it in iterators:
elem = next(it, sentinel)
if elem is sentinel:
return
result.append(elem)
yield tuple(result)
We will explore more of the characteristics and functionality of the Python zip
function throughout the rest of this tutorial.
Click here to return to the Table of Contents
How to Use the Python zip
Function With Different Data Structures
In the first example, how the Python zip
function can combine two lists into one zip
object whose elements are each tuples of length 2
.
It is important to understand that the Python zip
function is actually capable of working with many different data structures. We will explore how to use Python zip
with different data structures in this section.
How to Use Python zip
With Tuples
You can pass in two tuples into the Python zip
function exactly as we did with lists.
An example is below:
a = ("Nick", "Cheryl", "Jim")
b = ("Joseph", "John", "Kyle")
list(zip(a,b))
The output of this code is below:
[('Nick', 'Joseph'), ('Cheryl', 'John'), ('Jim', 'Kyle')]
As you can see, there is no practical difference between using Python zip
with tuples compared to using the function with lists.
How to Use Python zip
With Dictionaries
It is possible to use the Python zip
function to work with dictionaries, but with some limitations.
Consider the following example:
a = {"mother":"Andrea", "father":"Stephen"}
b = {"youngest":"John", "oldest": "Grace"}
list(zip(a,b))
What do you think the output of this code will be?
The Python zip
function zips together the keys of a dictionary by default. Accordingly, here's the output of the code executed above:
[('mother', 'youngest'), ('father', 'oldest')]
It is possible to zip together the values of the dictionary instead. To do this, call the values
method on the dictionary objects when you pass them into the zip
function.
Here's how you would do this using the same data from our earlier example.
a = {"mother":"Andrea", "father":"Stephen"}
b = {"youngest":"John", "oldest": "Grace"}
list(zip(a.values(),b.values()))
Here is the output of this code:
[('Andrea', 'John'), ('Stephen', 'Grace')]
How to Return Different Data Structures From the Python zip
Function
Just like we can pass in different data structures as arguments of the Python zip
function, it is possible to export different data types as well.
Recall that the default output of the Python zip
function is a special zip
object that looks like this:
<zip at 0x10ca43640>
To return a list, we wrapped it in the list
function. It should be of no surprise, then, that we can use tuple
and dict
to return tuples and dictionaries.
Here's an example using the tuple
function:
a = ("Nick", "Cheryl", "Jim")
b = ("Joseph", "John", "Kyle")
tuple(zip(a,b))
Here's the output:
(('Nick', 'Joseph'), ('Cheryl', 'John'), ('Jim', 'Kyle'))
And here's an example using the dict
function:
a = ("Nick", "Cheryl", "Jim")
b = ("Joseph", "John", "Kyle")
dict(zip(a,b))
And here's the output:
{'Nick': 'Joseph', 'Cheryl': 'John', 'Jim': 'Kyle'}
Click here to return to the Table of Contents
How to Use the Python zip
Function With More Than Two Arguments
Although the examples we have seen in this tutorial have only included two iterables, the Python zip
function is theoretically capable of accepting unlimited arguments. This section will demonstrate this capability.
To start, let's define three variables that we'd like to create a zip
object with. The variables are below:
canada_cities = ['Toronto', 'Montreal', 'Fredericton']
us_cities = ['New York City', 'San Francisco', 'Houston']
europe_cities = ['London', 'Paris', 'Munich']
We can zip these three objects together by passing them into the Python zip
function like this:
list(zip(canada_cities, us_cities, europe_cities))
Here is the output of the function:
[('Toronto', 'New York City', 'London'),
('Montreal', 'San Francisco', 'Paris'),
('Fredericton', 'Houston', 'Munich')]
As you can see, passing 3 arguments into the Python zip
function creates a new data structure whose elements are tuples of length 3
.
This extends to larger numbers as well. Said succinctly, passing N arguments into the Python zip
function creates a new data structure whose elements are tuples of length N
.
Click here to return to the Table of Contents
How the Python zip
Function Handles Arguments of Different Length
So far in this tutorial, we have only applied the Python zip
functions to data structures of the same length. The zip
function can accept arguments with different lengths. I will demonstrate this capability in this section.
Earlier in this tutorial, I embedded the explanation of the Python zip
function from the official documentation website.
The description included the following sentence: 'The iterator stops when the shortest input iterable is exhausted.'
This means that the length of the output of the Python zip
function will be equal to the length of its smallest argument.
Let's consider an example to help solidify this.
Specifically, let's examine a situation where you have a group of men and a group of women, and you want to pair them together for duo dance lessons. Here's how the Python zip
function could help with this:
men = ['Josiah', 'Micaiah', 'Elijah', 'Joel']
women = ['Chelsea', 'Robyn', 'Olivia']
list(zip(men,women))
Here is the output of this code:
[('Josiah', 'Chelsea'), ('Micaiah', 'Robyn'), ('Elijah', 'Olivia')]
Since the men
variable has one extra element than the women
variable, then the last element of the men
variable (Joel
) gets dropped from the Python zip
statement.
Click here to return to the Table of Contents
How To Loop Over Multiple Objects in Python Using Python zip
One of the main purposes of the Python zip
function is the ability to iterate over multiple objects simultaneously. The syntax for this is very Pythonic and easy to remember, which I why I wanted to conclude this tutorial with this topic.
Looping with Python zip
is best understood through an example. Imagine that you have a list of students and lists of grades, like this:
students = ['Nick', 'Joel', 'Taylor']
grades = [95, 75, 85]
If the students are ordered in the same way that the grades are, you could easily print each student's name and grade with the following loop:
for student, grade in zip(students, grades):
print(f"{student}'s grade is {grade}")
Here is the output of this code:
Nick's grade is 95
Joel's grade is 75
Taylor's grade is 85
Click here to return to the Table of Contents
Final Thoughts
In this tutorial, you learned how to use the Python zip
function to pair elements from different data structures and iterate through them using for
loops. If you're interested in learning more Python concepts, check out my courses Python Fundamentals and Advanced Python for Finance.