Navigation

Python

How to Use enumerate() vs range(len())

Use enumerate() instead of range(len()) for cleaner, more readable Python loops with automatic index and value access.

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!

More from Python