To iterate through two lists in parallel in Python, you can use the zip()
function, which pairs elements from each list. Here’s how to do it in detail, including handling edge cases and different scenarios:
1. Basic Parallel Iteration with zip()
The simplest way to iterate through two lists simultaneously:
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
for a, b in zip(list1, list2):
print(f"Element from list1: {a}, Element from list2: {b}")
# Output:
# Element from list1: 1, Element from list2: a
# Element from list1: 2, Element from list2: b
# Element from list1: 3, Element from list2: c
2. Handling Lists of Unequal Length
By default, zip()
stops at the shortest list. To iterate until the longest list is exhausted, use itertools.zip_longest
:
from itertools import zip_longest
list1 = [1, 2, 3, 4]
list2 = ['a', 'b', 'c']
# Fill missing values with a placeholder (default: `None`)
for a, b in zip_longest(list1, list2, fillvalue="NA"):
print(f"Element from list1: {a}, Element from list2: {b}")
# Output:
# Element from list1: 1, Element from list2: a
# Element from list1: 2, Element from list2: b
# Element from list1: 3, Element from list2: c
# Element from list1: 4, Element from list2: NA
3. Iterating with Indexes
If you need the index of the current iteration, use enumerate()
:
for idx, (a, b) in enumerate(zip(list1, list2)):
print(f"Index: {idx}, Elements: {a}, {b}")
# Output:
# Index: 0, Elements: 1, a
# Index: 1, Elements: 2, b
# Index: 2, Elements: 3, c
4. Iterating Over More Than Two Lists
zip()
works with any number of iterables:
list3 = [10, 20, 30]
for a, b, c in zip(list1, list2, list3):
print(f"Elements: {a}, {b}, {c}")
# Output:
# Elements: 1, a, 10
# Elements: 2, b, 20
# Elements: 3, c, 30
5. Creating Pairs (Tuples) of Elements
Convert the zipped result into a list of tuples:
paired_list = list(zip(list1, list2))
print(paired_list) # Output: [(1, 'a'), (2, 'b'), (3, 'c')]
Key Notes
zip()
Behavior: Stops at the shortest list by default.- Memory Efficiency:
zip()
returns an iterator (Python 3), making it memory-efficient for large lists. - Python 2 vs. 3: In Python 2,
zip()
returns a list of tuples. Useitertools.izip()
for iterator behavior.
Common Use Cases
Scenario | Code Example |
---|---|
Pair elements from two lists | for a, b in zip(list1, list2): ... |
Iterate with indexes | for idx, (a, b) in enumerate(zip(...)): ... |
Handle unequal lengths | from itertools import zip_longest |
Create paired data structures | pairs = list(zip(list1, list2)) |
Performance Tip
For very large datasets, zip()
(Python 3) is memory-efficient because it uses lazy evaluation (elements are generated on-the-fly).
Example: Combining Lists into a Dictionary
keys = ['name', 'age', 'city']
values = ['Alice', 30, 'New York']
data = dict(zip(keys, values))
print(data) # Output: {'name': 'Alice', 'age': 30, 'city': 'New York'}
Summary
- Use
zip()
for parallel iteration over lists of equal length. - Use
itertools.zip_longest()
for lists of unequal length. - Combine with
enumerate()
to track indexes.