enumerate() wraps an iterable and yields (index, value) pairs, eliminating the need for a manual counter variable. It is O(1) memory (returns a lazy iterator) and supports a start parameter to control the starting index.
fruits = ["apple", "banana", "cherry", "date"]
# Without enumerate — error-prone manual counter
for i in range(len(fruits)):
print(i, fruits[i])
# With enumerate — Pythonic, cleaner
for i, fruit in enumerate(fruits):
print(i, fruit)
# 0 apple
# 1 banana
# 2 cherry
# 3 date
# Custom start index
for i, fruit in enumerate(fruits, start=1):
print(f"{i}. {fruit}")
# 1. apple
# 2. banana
# 3. cherry
# 4. date
# Building indexed structures
index_map = {fruit: i for i, fruit in enumerate(fruits)}
print(index_map) # {'apple': 0, 'banana': 1, 'cherry': 2, 'date': 3}
# Tracking position while modifying (safe pattern)
data = [3, -1, 4, -1, 5, 9, -2]
for i, val in enumerate(data):
if val < 0:
data[i] = 0 # replace negatives in-place using index
print(data) # [3, 0, 4, 0, 5, 9, 0]
# Works with any iterable
for line_no, line in enumerate(open("README.md"), start=1):
if "TODO" in line:
print(f"Line {line_no}: {line.rstrip()}")
break
Use Case: A CSV validator uses enumerate(rows, start=2) (header is row 1) to report validation errors with their exact spreadsheet line number: "Row 47: missing required field 'email'" — without any manual counter.
↥ back to top