Table Of Contents
Problem
You need both the index and value when iterating over a list, but using range(len())
creates verbose and less readable code.
Solution
# Bad: Using range(len())
items = ['apple', 'banana', 'orange']
for i in range(len(items)):
print(f"{i}: {items[i]}")
# Good: Using enumerate()
for i, item in enumerate(items):
print(f"{i}: {item}")
# Start counting from different number
for i, item in enumerate(items, start=1):
print(f"{i}: {item}")
# 1: apple
# 2: banana
# 3: orange
# Find index of specific item
def find_index(items, target):
for i, item in enumerate(items):
if item == target:
return i
return -1
index = find_index(['a', 'b', 'c'], 'b') # Returns 1
# Process with condition based on index
data = [10, 20, 30, 40, 50]
processed = []
for i, value in enumerate(data):
if i % 2 == 0: # Even indices
processed.append(value * 2)
else: # Odd indices
processed.append(value)
print(processed) # [20, 20, 60, 40, 100]
# Enumerate with slicing
text = "hello world"
for i, char in enumerate(text[2:], start=2):
print(f"Position {i}: {char}")
# Compare performance (enumerate is faster)
import timeit
items = list(range(1000))
def with_range_len():
result = []
for i in range(len(items)):
result.append((i, items[i]))
return result
def with_enumerate():
result = []
for i, item in enumerate(items):
result.append((i, item))
return result
# enumerate() is faster and more memory efficient
print("range(len()):", timeit.timeit(with_range_len, number=1000))
print("enumerate():", timeit.timeit(with_enumerate, number=1000))
# Convert enumerate to list for multiple uses
indexed_items = list(enumerate(['x', 'y', 'z']))
print(indexed_items) # [(0, 'x'), (1, 'y'), (2, 'z')]
Explanation
enumerate()
returns tuples of (index, value) for each item in an iterable. It's more readable, faster, and more Pythonic than range(len())
.
Use start
parameter to begin counting from a different number. enumerate()
works with any iterable, not just lists, making your code more flexible.
Share this article
Add Comment
No comments yet. Be the first to comment!