The zip() function in Python programming is a built-in standard function that takes multiple iterables or containers as parameters. An iterable in Python is an object that can be iterated or stepped through like a collection.

The zip() function is used to map the same indexes of more than one iterable. Mapping these indexes will generate a zip object.

Table of Contents

## How zip function works?

The zip function pairs the first elements of each iterator together then pairs the second elements together and so on.

If the iterables in the zip function are not the same length, then the smallest length iterable decides the length of the generated output.

**Syntax:**

1 | zip(iterable0, iterable1, interable2, …) |

Iterables can be Python lists, dictionary, strings, or any iterable object.

In the syntax above, the iterable0, iterable1, etc. are the iterator objects that we need to join using the zip function.

**Example:**

Consider the following snippet, where we have three iterables and the zip function joins them together.

1 2 3 4 5 6 7 8 9 10 11 | x = ("Joey", "Monica", "Ross") y = ("Chandler", "Pheobe") z = ("David", "Rachel", "Courtney") result = zip(x, y, z) print(result) print(tuple(result)) |

**Output:**

1 | (('Joey', 'Chandler', 'David'), ('Monica', 'Pheobe', 'Rachel')) |

In the above example, we defined three iterators of different lengths. The first elements of all of them are joined together, similarly, the second elements of all of them are joined together.

But there is no third element in the iterator ** y**, therefore, the third elements of remaining iterators are not included in the output object.

This is why we said before that the length of the output is determined by the length of the smallest iterator which is 2 in this case.

The tuple() function converts the zip object to a tuple.

If no parameters are passed to the function, an empty iterable will be generated. For example, the result of print(tuple(zip())) will be ():

## Convert two lists to a dictionary

To convert two lists to a dictionary using the zip function, you will join the lists using the zip function as we did, then you can convert them to a dictionary.

Suppose we have two lists as follows:

1 2 3 | coin = ('Bitcoin', 'Ether', 'Ripple', 'Litecoin') code = ('BTC', 'ETH', 'XRP', 'LTC') |

So we will zip the list and then use the dict() function to convert it to a dictionary:

1 | dict(zip(coin, code)) |

The output will be:

1 | {'Bitcoin': 'BTC', 'Ether': 'ETH', 'Ripple': 'XRP', 'Litecoin': 'LTC'} |

## Zip function on three/multiple lists

You can pass multiple iterables to the zip function of same or different types. In the following example, we defined three lists (all are of the same length) but the data type of the items in each list is different.

**Example:**

1 2 3 4 5 6 7 8 9 | list_a = ['Bitcoin', 'Ethereum', 'Ripple', 'Litecoin', 'Bitcoin-cash'] list_b = ['BTC', 'ETH', 'XRP', 'LTC', 'BCH'] list_c = ['11605', '271', '0.335', '102', '347'] result = zip(list_a, list_b, list_c) print(tuple(result)) |

**Output:**

1 | (('Bitcoin', 'BTC', '11605'), ('Ethereum', 'ETH', '271'), ('Ripple', 'XRP', '0.335'), ('Litecoin', 'LTC', '102'), ('Bitcoin-cash', 'BCH', '347')) |

Similarly, we can join more than three iterables using the zip() function the same way.

## Zip different length lists

When the arguments in the zip() function are different in length, the output object length will equal the length of the shortest input list.

Consider the following example to get a clearer view:

**Example:**

1 2 3 4 5 6 7 | list_a = [1, 2, 3, 4, 5] list_b = ['one', 'two', 'three'] result = zip(list_a, list_b) print(tuple(result)) |

**Output:**

1 | ((1, 'one'), (2, 'two'), (3, 'three')) |

In this example, list_a has 5 elements and list_b has 3 elements. The iterator will stop when it reaches the third element. Therefore, we have 3 tuples in the output tuple.

## Zip function asterisk (Unzip)

The asterisk in a zip() function converts the elements of the iterable into separate elements. For example: if a = [a1, a2, a3] then zip(*a) equals to ((‘a’, ‘a’, ‘a’), (‘1’, ‘2’, ‘3’)).

In other words, we can say the asterisk in the zip function **unzips** the given iterable. That’s why the elements in list “a” are unzipped or extracted.

Consider the following example:

**Example:**

1 2 3 4 5 | a = ['a1', 'a2', 'a3'] r = zip(*a) print(tuple(r)) |

**Output:**

1 | (('a', 'a', 'a'), ('1', '2', '3')) |

## Zip a matrix

A matrix is a multidimensional array of *m*n*, where *m* represents the number of rows and *n* represents the number of columns.

In Python, we can use the zip function to find the transpose of the matrix. The first step is to unzip the matrix using the * operator and finally zip it again as in the following example:

1 2 3 4 5 | mat = [[1,2,3], [4,5,6]] trans_mat = zip(*mat) print(tuple(trans_mat)) |

**Output:**

1 | ((1, 4), (2, 5), (3, 6)) |

In this example, the matrix is a 2*3 matrix meaning that it has 2 rows and 3 columns. On taking the transpose of the matrix, there will be 3 rows and 2 columns.

Similarly, if we have 1 row and 3 columns in a matrix as:

1 | [[1, 2, 3]] |

On taking the transpose, we should have 3 rows and 1 column. Consider the following snippet:

**Example:**

1 2 3 4 5 | mat = [[1,2,3]] trans_mat = zip(*mat) print(tuple(trans_mat)) |

**Output:**

1 | ((1,), (2,), (3,)) |

## Iterate through two lists in parallel

We can also iterate through two lists simultaneously using the zip function. This is demonstrated in the following line of code:

**Example:**

1 2 3 4 5 6 7 | list_1 = ['Numpy', 'asyncio', 'cmath', 'enum', 'ftplib'] list_2 = ['C', 'C++', 'Java', 'Python'] for i, j in zip(list_1, list_2): print(i, j) |

**Output:**

1 2 3 4 5 6 7 | Numpy C asyncio C++ cmath Java enum Python |

In the above example, we have two different lists. The *for* loop uses two iterative variables to iterate through the lists that are zipped together to work in parallel.

## Zip a list of floats

The zip function also works on floating-point numbers. The floating-point numbers contain decimal point like 10.3, 14.44, etc.

In this section, we will create an example where zip function iterates through a list of floats:

1 2 3 4 5 6 7 | >>> float_list1 = [12.3, 10.99, 3.33, 2.97] >>> float_list2 = [78.13, 0.89, 4.6, 0.7] >>> float_zip = zip(float_list1, float_list2) >>> print(tuple(float_zip)) |

**Output:**

1 | ((12.3, 78.13), (10.99, 0.89), (3.33, 4.6), (2.97, 0.7)) |

## Pass a single iterable

If one iterable is passed in the arguments of zip() function, there would be one item in each tuple. This is demonstrated below:

**Example:**

1 2 3 4 5 | list_1 = ['C', 'C++', 'Python', 'Java'] list_zip = zip(list_1) print(tuple(list_zip)) |

**Output**

1 | (('C',), ('C++',), ('Python',), ('Java',)) |

## Output to a file

To save the output from the zip function into a file. Consider the following example:

The first step is to open a file (we will use the append mode so nothing of existing content will be deleted). Use the following line:

1 | f = open("zipOutput.txt", "a+") |

If the file doesn’t exist, it will be created.

Now let’s create two lists to zip together.

1 2 3 | list_1 = ['C', 'C++', 'Python', 'Java'] list_2 = ['Solidity', 'Android', 'Php', 'Kotlin'] |

Finally, use the for loop to iterate through lists in zip function and write the result in the file (after converting a tuple to string):

1 2 3 | for i in zip(list_1, list_2): f.write(str(i)) |

Now close the file and check the saved data.

1 | f.close() |

The following will be the contents of the file:

Also, there is a shorter code instead of using the for loop. We can convert the zip object to a tuple then to a string and write the string to the file:

1 | f.write(str(tuple(zip(list_1,list_2)))) |

It will lead to the same result.

Working with zip function in Python is pretty neat and easy. The idea is about merging iterables together which comes handy in many cases. I hope you find the tutorial useful.

Keep coming back.

Great tutorial. Thank you!

You’re welcome!