Juha-Matti Santala

# Combine iterables with zip

Batteries included is a blog series about the Python Standard Library. Each day, I share insights, ideas and examples for different parts of the library. Blaugust is an annual blogging festival in August where the goal is to write a blog post every day of the month.

If you’re new to Python, either as a new programmer in general or coming from another programming language, a handy Python built-in to learn is zip.

## Combine similar iterables

Zip allows you to combine two or more iterables into one with each corresponding item being grouped:

``````letters = ['A', 'B', 'C', 'D']
numbers = [1, 2, 3, 4]

for letter, number in zip(letters, numbers):
print(f'{letter} and {number}')

# A and 1
# B and 2
# C and 3
# D and 4``````

An equivalent non-zip solution using indices could look like this:

``````letters = ['A', 'B', 'C', 'D']
numbers = [1, 2, 3, 4]

for index in range(len(letters)):
letter = letters[index]
number = numbers[index]
print(f'{letter} and {number}')``````

In my opinion, the first one is more elegant and more pythonic, taking advantage of language’s constructs and built-ins in a way that improves readability.

If your iterables are not of equal length, the zip will ignore all the unpaired ones:

``````longer = [1, 2, 3, 4, 5, 6, 7]
shorter = [1, 2, 3]

for first, second in zip(longer, shorter):
print(f'{first} and {second}')

# 1 and 1
# 2 and 2
# 3 and 3``````

If you want to zip in a way that keeps all the items from the longest iterable, you can use `itertools.zip_longest` which allows defining a fill value for missing items:

``````from itertools import zip_longest
longer = [1, 2, 3, 4, 5, 6, 7]
shorter = [1, 2, 3]

for first, second in zip_longest(longer, shorter, fillvalue=0):
print(f'{first} and {second}')

# 1 and 1
# 2 and 2
# 3 and 3
# 4 and 0
# 5 and 0
# 6 and 0
# 7 and 0``````

## Transpose a matrix

When working with two-dimensional lists (lists of lists), there often comes a need to transpose the array which means switching columns and rows:

``````1  2  3
4  5  6
7  8  9

->

1  4  7 (first column of the original)
2  5  8
3  6  9``````

To achieve this with Python, you can zip the unpacked list:

``````matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
transposed = zip(*matrix)``````

(Note that if you’re dealing with a lot of matrix shaped data, pandas offers good tooling for them.)