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. Незначительные внутренние оптимизации не влияют на поведение, видимое пользователю.
Расширенные примеры
Поиск индексов элементов, удовлетворяющих условию:
numbers = [7, 3, 10, 4, 8]
indices = [i for i, num in enumerate(numbers) if num > 5]
print(indices)[0, 2, 4]
Создание словаря с нумерацией элементов:
fruits = ['яблоко', 'банан', 'апельсин']
fruit_dict = {i: fruit for i, fruit in enumerate(fruits, 1)}
print(fruit_dict){1: 'яблоко', 2: 'банан', 3: 'апельсин'}Обработка вложенных структур:
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
Использование с генераторами:
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:
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