Enumerate: примеры (PYTHON)

Работа с функцией enumerate в языке программирования Python
Раздел: Встроенные функции, Итерации
enumerate(iterable: Iterable, start: int = 0): enumerate object

Функция enumerate в Python

Функция enumerate в Python возвращает объект-итератор, который генерирует кортежи, содержащие индекс элемента и сам элемент для перебираемой последовательности. Её применяют, когда необходим доступ как к элементам коллекции, так и к их индексам в цикле. Использование enumerate избавляет от необходимости вручную создавать и увеличивать счётчик.

Синтаксис:

enumerate(iterable, start=0)

Аргументы:

  • iterable (обязательный) - любой итерируемый объект: список, кортеж, строка, множество, словарь или генератор.
  • start (необязательный) - целое число, определяющее начальное значение счётчика. Значение по умолчанию равно 0.

Возвращаемое значение:

Функция возвращает объект типа enumerate, который является итератором. При каждом обращении итератор возвращает кортеж вида (индекс, элемент). При преобразовании в список получается список кортежей.

Примеры использования enumerate

Базовый пример со списком:

fruits = ['яблоко', 'груша', 'слива']
for index, fruit in enumerate(fruits):
    print(index, fruit)
0 яблоко
1 груша
2 слива

Использование параметра start:

fruits = ['яблоко', 'груша', 'слива']
for index, fruit in enumerate(fruits, start=1):
    print(f'Позиция {index}: {fruit}')
Позиция 1: яблоко
Позиция 2: груша
Позиция 3: слива

Работа со строками:

word = 'Python'
for i, char in enumerate(word):
    print(f'Символ {char} имеет индекс {i}')
Символ P имеет индекс 0
Символ y имеет индекс 1
Символ t имеет индекс 2
Символ h имеет индекс 3
Символ o имеет индекс 4
Символ n имеет индекс 5

Преобразование в список кортежей:

colors = ['красный', 'зелёный', 'синий']
list(enumerate(colors, 10))
[(10, 'красный'), (11, 'зелёный'), (12, 'синий')]

Похожие функции в Python

range(len()) - классический способ получения индексов для цикла. Предпочтителен в простых случаях, когда доступ к элементам по индексу не требует дополнительных операций.

arr = ['a', 'b', 'c']
for i in range(len(arr)):
    print(i, arr[i])
0 a
1 b
2 c

zip() - объединяет несколько итерируемых объектов. Используется для параллельного перебора нескольких коллекций. В отличие от enumerate, не генерирует индексы самостоятельно.

names = ['Анна', 'Борис', 'Кирилл']
ages = [25, 30, 35]
for name, age in zip(names, ages):
    print(f'{name} - {age} лет')
Анна - 25 лет
Борис - 30 лет
Кирилл - 35 лет

Итерация по словарю - методы items(), keys(), values() обеспечивают доступ к парам ключ-значение. enumerate применяют к словарям редко, обычно для нумерации ключей или значений.

Аналоги функции в других языках

JavaScript:

Метод Array.prototype.forEach() или цикл for...of с индексом. Аналогом может выступать метод entries() для массивов.

const fruits = ['apple', 'pear', 'plum'];
for (const [index, fruit] of fruits.entries()) {
    console.log(index, fruit);
}
0 apple
1 pear
2 plum

PHP:

Функция foreach с флагом $key => $value. Для индексированных массивов ключ является числовым индексом.

$fruits = ['яблоко', 'груша', 'слива'];
foreach ($fruits as $index => $fruit) {
    echo $index . ' ' . $fruit . PHP_EOL;
}
0 яблоко
1 груша
2 слива

Java:

Стандартный цикл for с счётчиком или интерфейс Iterator. Явного аналога нет, требуется ручное управление индексом.

List fruits = List.of("apple", "pear", "plum");
for (int i = 0; i < fruits.size(); i++) {
    System.out.println(i + " " + fruits.get(i));
}
0 apple
1 pear
2 plum

C#:

Метод Enumerable.Select() с перегрузкой, принимающей индекс, или цикл for.

var fruits = new List { "apple", "pear", "plum" };
foreach (var (index, fruit) in fruits.Select((f, i) => (i, f))) {
    Console.WriteLine($"{index} {fruit}");
}
0 apple
1 pear
2 plum

Go:

Цикл for с range возвращает индекс и значение для срезов и массивов. Поведение максимально приближено к Python.

fruits := []string{"apple", "pear", "plum"}
for index, fruit := range fruits {
    fmt.Println(index, fruit)
}
0 apple
1 pear
2 plum

Типичные ошибки

Изменение размера коллекции во время итерации:

items = [1, 2, 3, 4]
for i, item in enumerate(items):
    if item % 2 == 0:
        items.pop(i)  # Опасная операция!
print(items)
Возможны непредсказуемые результаты или ошибка IndexError

Ожидание изменения оригинальной коллекции:

enumerate создаёт новый объект-итератор, но не изменяет исходные данные. Попытки модифицировать элементы через возвращаемый кортеж не влияют на оригинал.

data = [10, 20, 30]
for i, val in enumerate(data):
    val = val * 2  # Эта операция не изменит список data
print(data)
[10, 20, 30]

Использование с неитерируемыми объектами:

num = 42
for item in enumerate(num):
    print(item)
TypeError: 'int' object is not iterable

Изменения в функции

В Python 2 функция enumerate возвращала список кортежей, а не итератор. Современная реализация в виде итератора появилась в Python 3. Это улучшило производительность, особенно для больших коллекций, так как элементы генерируются по требованию, а не хранятся в памяти сразу.

Семантика и параметры функции остаются стабильными на протяжении многих версий Python 3. Незначительные внутренние оптимизации не влияют на поведение, видимое пользователю.

Расширенные примеры

Поиск индексов элементов, удовлетворяющих условию:

Пример python
numbers = [7, 3, 10, 4, 8]
indices = [i for i, num in enumerate(numbers) if num > 5]
print(indices)
[0, 2, 4]

Создание словаря с нумерацией элементов:

Пример python
fruits = ['яблоко', 'банан', 'апельсин']
fruit_dict = {i: fruit for i, fruit in enumerate(fruits, 1)}
print(fruit_dict)
{1: 'яблоко', 2: 'банан', 3: 'апельсин'}

Обработка вложенных структур:

Пример python
matrix = [[1, 2], [3, 4], [5, 6]]
for row_idx, row in enumerate(matrix):
    for col_idx, value in enumerate(row):
        print(f'[{row_idx},{col_idx}] = {value}')
[0,0] = 1
[0,1] = 2
[1,0] = 3
[1,1] = 4
[2,0] = 5
[2,1] = 6

Использование с генераторами:

Пример python
def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

for i, fib_num in enumerate(fibonacci(5)):
    print(f'F({i}) = {fib_num}')
F(0) = 0
F(1) = 1
F(2) = 1
F(3) = 2
F(4) = 3

Применение в условии с next:

Пример python
data = ['a', 'b', 'c', 'd', 'e']
target = 'c'
index = next(i for i, val in enumerate(data) if val == target)
print(f'Элемент {target} найден на позиции {index}')
Элемент c найден на позиции 2

питон enumerate function comments

En
Enumerate Return an enumerate object