Счетчик элементов последовательности в циклах Python
Функция enumerate() вернет кортеж, содержащий отсчет от start и значение, полученное из итерации по объекту. Переданный в функцию объект должен быть последовательностью, итератором или другим объектом, который поддерживает метод итератора __next__() .
Функция enumerate() применяется в случаях, когда необходим счётчик количества элементов в последовательности. Позволяет избавиться от необходимости инициировать и обновлять отдельную переменную-счётчик.
Функцию enumerate() можно записать так:
def enumerate(sequence, start=0): n = start for elem in sequence: yield n, elem n += 1
Примеры использования функции enumerate() :
Наиболее часто функцию enumerate() используют в цикле for/in в качестве счетчика элементов последовательности:
>>> seq = list('абвгде') >>> seq # ['а', 'б', 'в', 'г', 'д', 'е'] >>> for i, val in enumerate(seq, start=1): . print(f'№ i> => val>') . # № 1 => а # № 2 => б # № 3 => в # № 4 => г # № 5 => д # № 6 => е
Получение списка парных кортежей (number, value) (порядковый номер в последовательности, значение последовательности).
>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter'] >>> list(enumerate(seasons)) [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')] # можно указать с какой цифры начинать считать >>> list(enumerate(seasons, start=1)) [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
Использование enumerate() для нахождения индексов минимального и максимального значений в числовой последовательности:
>>> lst = [5, 3, 1, 0, 9, 7] # пронумеруем список >>> lst_num = list(enumerate(lst, 0)) # получился список кортежей, в которых # первый элемент - это индекс значения списка, # а второй элемент - само значение списка >>> lst_num # [(0, 5), (1, 3), (2, 1), (3, 0), (4, 9), (5, 7)] # найдем максимум (из второго значения кортежей) >>> tup_max = max(lst_num, key=lambda i : i[1]) >>> tup_max # (4, 9) >>> f'Индекс максимума: tup_max[0]>, Max число tup_max[1]>' # 'Индекс максимума: 4, Max число 9' # найдем минимум (из второго значения кортежей) >>> tup_min = min(lst_num, key=lambda i : i[1]) >>> tup_min # (3, 0) >>> f'Индекс минимума: tup_min[0]>, Min число tup_min[1]>' # 'Индекс минимума: 3, Min число 0'
Использование функции enumerate() для того, что бы напечатать завершающий символ перевода строки.
import sys, time def teleprint(*args, delay=0.05, str_join=' '): """ Замедленный вывод текста в консоли """ text = str_join.join(str(x) for x in args) n = len(text) for i, char in enumerate(text, 1): # если количество символов # равно текущему счетчику. if i == n: # печать последнего символа с переводом строки '\n' char = f'char>\n' sys.stdout.write(char) sys.stdout.flush() time.sleep(delay) >>> teleprint('Привет Python!') # Привет Python! >>>
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Функция abs(), абсолютное значение числа
- Функция all(), все элементы True
- Функция any(), хотя бы один элемент True
- Функция ascii(), преобразует строку в ASCII
- Функция bin(), число в двоичную строку
- Класс bool(), логическое значение объекта
- Функция breakpoint(), отладчик кода
- Класс bytearray(), преобразует в массив байтов
- Класс bytes(), преобразует в строку байтов
- Функция callable(), проверяет можно ли вызвать объект
- Функция chr(), число в символ Юникода
- Класс classmethod, делает функцию методом класса
- Функция compile() компилирует блок кода Python
- Класс complex(), преобразует в комплексное число
- Функция delattr(), удаляет атрибут объекта
- Класс dict() создает словарь
- Функция dir(), все атрибуты объекта
- Функция divmod(), делит числа с остатком
- Функция enumerate(), счетчик элементов последовательности
- Функция eval(), выполняет строку-выражение с кодом
- Функция exec(), выполняет блок кода
- Функция filter(), фильтрует список по условию
- Класс float(), преобразует в вещественное число
- Функция format(), форматирует значение переменной
- Класс frozenset(), преобразует в неизменяемое множество
- Функция getattr(), значение атрибута по имени
- Функция globals(), переменные глобальной области
- Функция hasattr(), наличие атрибута объекта
- Функция hash(), хэш-значение объекта
- Функция help(), справка по любому объекту
- Функция hex(), число в шестнадцатеричную строку
- Функция id(), идентификатор объекта
- Функция input(), ввод данных с клавиатуры
- Класс int(), преобразует в тип int
- Функция isinstance(), принадлежность экземпляра к классу
- Функция issubclass(), проверяет наследование класса
- Функция iter(), создает итератор
- Функция len(), количество элементов объекта
- Класс list(), преобразовывает в список
- Функция locals(), переменные локальной области
- Функция map(), обработка последовательности без цикла
- Функция max(), максимальное значение элемента
- Класс memoryview(), ссылка на буфер обмена
- Функция min(), минимальное значение элемента
- Функция next(), следующий элемент итератора
- Класс object(), возвращает безликий объект
- Функция oct(), число в восьмеричную строку
- Функция open(), открывает файл на чтение/запись
- Функция ord(), число символа Unicode
- Функция pow(), возводит число в степень
- Функция print(), печатает объект
- Класс property(), метод класса как свойство
- Класс range(), генерирует арифметические последовательности
- Функция repr(), описание объекта
- Функция reversed(), разворачивает последовательность
- Функция round(), округляет число
- Класс set(), создает или преобразовывает в множество
- Функция setattr(), создает атрибут объекта
- Класс slice(), шаблон среза
- Функция sorted(), выполняет сортировку
- Декоратор staticmethod(), метод класса в статический метод
- Класс str(), преобразует объект в строку
- Функция sum(), сумма последовательности
- Функция super(), доступ к унаследованным методам
- Класс tuple(), создает или преобразует в кортеж
- Класс type(), возвращает тип объекта
- Функция vars(), словарь переменных объекта
- Функция zip(), объединить элементы в список кортежей
- Функция __import__(), находит и импортирует модуль
- Функция aiter(), создает асинхронный итератор
- Функция anext(), следующий элемент асинхронного итератора
Функция enumerate
В Python есть еще одна встроенная функция, которая часто используется в заголовке for . Это функция enumerate() . Если range() позволяет получить только индексы элементов списка, то enumerate() – сразу индекс элемента и его значение.
Функция enumerate() применяется для так называемых итерируемых объектов (список относится к таковым) и создает объект-генератор, который генерирует кортежи, состоящие из двух элементов – индекса элемента и самого элемента.
>>> spisok = [16, 46, 26, 36] >>> for i in enumerate(spisok): . print(i) . (0, 16) (1, 46) (2, 26) (3, 36)
>>> b = "hello" >>> for i in enumerate(b): . print(i) . (0, 'h') (1, 'e') (2, 'l') (3, 'l') (4, 'o')
Эти кортежи можно распаковывать, то есть извлекать индекс и значение, в теле цикла:
>>> for item in enumerate(spisok): . print(item[0], item[1]) . 0 16 1 46 2 26 3 36
Однако чаще это делают еще в заголовке for , используя две переменные перед in :
>>> for id, val in enumerate(spisok): . print(id, val) . 0 16 1 46 2 26 3 36
Функция enumerate используется для упрощения прохода по коллекциям в цикле, когда кроме самих элементов требуется их индекс:
>>> a = [10, 20, 30, 40] >>> for id, item in enumerate(a): . a[id] = item + 5 . >>> a [15, 25, 35, 45]
В данном случае на каждой итерации цикла из объекта, полученного от вызова функции enumerate , извлекается очередной кортеж. Этот кортеж состоит из индекса очередного элемента списка и значения этого элемента. Элементы кортежа связываются с идентификаторами id и item .
Без использования enumerate в цикл пришлось бы вводить переменную-счетчик:
>>> a = [10, 20, 30, 40] >>> # используется счетчик >>> for num in a: . a[id] = num + 5 . id += 1 . >>> a [15, 25, 35, 45]
Или извлекать элементы по индексу:
>>> a = [10, 20, 30, 40] >>> for i in range(len(a)): # перебор по индексам . a[i] += 5 . >>> a [15, 25, 35, 45]
Другими словами, без функции enumerate можно обойтись. Однако в ряде случаев она может быть удобней.
Если enumerate() так хороша, зачем использовать range() в заголовке for ? На самом деле незачем, если только вам так не проще. Кроме того, бывают ситуации, когда значения не нужны, нужны только индексы. Однако следует учитывать один нюанс. Функция enumerate() возвращает так называемый объект-итератор. Когда такие объекты сгенерировали значения, то становятся «пустыми». Второй раз по ним пройтись нельзя.
Функция range() возвращает итерируемый объект. Хотя такой объект может быть превращен в объект-итератор, сам по себе таковым не является.
Когда range() и enumerate() используются в заголовке for , то разницы нет, так как range- и enumerate-объекты не присваиваются переменным и после завершения работы цикла теряются. Но если мы присваиваем эти объекты переменным, их отличия могут сказаться на выполнении программы:
>>> nums = [34, 15, 124, 800, 339] >>> >>> r_obj = range(len(nums)) >>> e_obj = enumerate(nums) >>> >>> for i in r_obj: . print(i) . if i == 1: . break . 0 1 >>> for i in r_obj: . print(nums[i]) . if i == 1: . break . 34 15 >>> for i, v in e_obj: . print(v) . if i == 1: . break . 34 15 >>> for i in r_obj: . print(nums[i]) . 34 15 124 800 339 >>> for i, v in e_obj: . print(v) . 124 800 339
Сначала мы прерываем извлечение элементов из объектов на элементе с индексом 1. Когда снова прогоняем объекты через цикл for , то в случае r_obj обход начинается сначала, а в случае e_obj продолжается после места останова. Объект e_obj уже не содержит извлеченных ранее элементов.
Практическая работа
Дан список чисел. Используя функцию enumerate() в заголовке цикла for , создайте второй список, в котором каждый элемент должен быть строкой, включающей через пробел индекс и значение соответствующего элемента первого списка.
Примеры решения и дополнительные уроки в pdf-версии курса
X Скрыть Наверх
Python. Введение в программирование
Функция enumerate
В языке программирования Python 3 есть встроенная функция enumerate. Периодически требуется пройти по элементам списка и при этом обрабатывать не только значение элемента, но так же и его порядковый номер в списке. Вот в этом случае она и понадобится.
Аргументы
Аргументов у функции enumerate два:
- Объект, элементы которого будем перебирать. Необязательно это должен быть список, это может быть, например, множество или словарь.
- Начальное значение индекса (start). По умолчанию начальное значение равно 0.
Возвращает итератор на кортеж из двух элементов: индекс и элемент объекта.
Пример использования
Вот пример использования. С помощью enumerate мы перебираем весь список data . При переборе мы получали кортеж, состоящий из двух элементов. В переменной num будет порядковый номер элемента в списке. В переменной val – значение элемента. В качестве второго аргумента в функции enumerate мы использовали цифру 1, чтобы индексы начинались с единицы, а не с нуля.
data = [2, 5, 3, 4, 1, 5] for num, val in enumerate(data, 1): print(str(num) + '-ое значение равно ' + str(val)) 1-ое значение равно 2 2-ое значение равно 5 3-ое значение равно 3 4-ое значение равно 4 5-ое значение равно 1 6-ое значение равно 5
Без использования enumerate
Если не использовать enumerate в Python 3, то можно сделать свой счетчик. Задать ему начальное значение и при каждом проходе цикла его увеличивать. Например, следующим образом.
colors = ['red', 'green', 'blue'] ind = 1 for color in colors: print(str(ind) + '-й цвет: ' + color) ind += 1 1-й цвет: red 2-й цвет: green 3-й цвет: blue
Но раз есть в Python 3 такая функция, как enumerate, то ей надо пользоваться. Она упрощает код, делает его более понятным.
Использование next
Функция enumerate возвращает итератор. Используя функцию next можно получить кортежи.
a = [2, 5, 3, 4, 1, 5] b = enumerate(a) c = next(b) print(c) print(type(c)) print(next(b)) (0, 2) (1, 5)
Если при очередном вызове next, следующий элемент будет отсутствовать, возникает исключение StopIteration. Подробнее про типы исключений и как их обрабатывать есть отдельная статья на сайте.
Функция enumerate() в Python
Что такое функция enumerate() в Python и для чего нужна
Функция enumerate() возвращает объект, который можно использовать для перечисления элементов итерируемого объекта вместе с их порядковыми номерами.
С помощью функции enumerate() можно выполнять такие действия:
-
Вести перечисление элементов. Можно легко перечислить элементы списка, кортежа или другого итерируемого объекта, присвоив им порядковые номера (например, при составлении таблицы).
Експертний курс від mate.academy: Fullstack Web Development.
Відкрийте світ розробки у свій вільний час.
Синтаксис функции enumerate() в Python
Так как функция enumerate() позволяет перебирать элементы списка или другой итерируемой последовательности и возвращает индекс каждого элемента, синтаксис функции выглядит так:
- iterable — это итерируемая последовательность, которую нужно перебирать;
- start — это необязательный параметр, который определяет начальное значение для счетчика индекса. По умолчани ю если его не указывать параметр start равен 0.
При выполнении, функ ция enumerate() в озвращает объект перечислителя, который содержит кортежи (индекс, значение) для каждого элемента в итерируемой последовательности. Индекс начинается с start и увеличивается на 1 для каждого последующего элемента.
Динамічний курс від skvot: Візуалізація екстер’єрів у 3DS MAX.
Мистецтво в 3DS MAX.
Изучаешь Python самостоятельно и чувствуешь, что нужна помощь опытного ментора? Приходи на курсы Python Basic и Python Pro от Hillel и начни свой путь в IT.
Пример использования функции enumerate() для простого перебора элементов списка
Давайте рассмотрим простой пример перебора элементов списка. Допустим, у нас есть такой набор слов:
yakisslova = ['Highload', 'Today', 'Yesterday', 'Tomorrow'] for index, slovo in enumerate(yakisslova): print(index, slovo)
Результат выполнения этого перебора элементов:
0 Highload 1 Today 2 Yesterday 3 Tomorrow
Каждый элемент списка представлен кортежем (индекс, значение), который мы распаковываем в переменные index и slovo . Затем мы выводим значения переменных index и slovo . Индексы в Python начинаются с нуля.
Пример перечисления и вывода слов на экран из списка
Допустим, мы хотим перечислить и вывести на экран некоторые слова в списк е words и их порядковые номера с помощью функции enumerate() . При этом хотим начать перечисление и вывод не с нуля, а с единицы.
Используем такой код на Python:
words = ["Highload", "Today", "Kiyv", "Technology", "Pythonexample"] # Используем функцию enumerate() для перечисления элементов списка words for index, word in enumerate(words): print(f". ")
В этом примере функци я enumerate() используется для перечисления слов в списке words .
В цикле for перебираются элементы списка words . При этом функция enumerate() возвращает пару ( index , word ), где:
- index — это порядковый номер элемента;
- word — значение элемента.
Ефективний курс від robotdreams: Software Architect.
Від ідеї до коду.
Мы выводим порядковый номер каждого элемента на экран, увеличенный на 1, чтобы он начинался с 1, а не с 0 По умолчанию номера индексов идут с нуля. . Затем выводится значение каждого элемента списка words .
Результат работы программы:
1. Highload 2. Today 3. Kiyv 4. Technology 5. Pythonexample
Пример создания таблицы из двумерного списка
Рассмотрим создание таблицы из двумерного списка, где первый столбец содержит порядковые номера строк. Это может быть полезным, например, при выводе результатов работы программы в удобочитаемом формате.
Допустим, мы имеем такой список с перечнем информации о студентах:
students = [ ['Хайлодов', 'Максим', '19'], ['Тудейкин', 'Константин', '20'], ['Хмуроутров', 'Илья', '18'], ['Шизобрякин', 'Валентин', '22'] ]
Мы можем использовать функцию enumerate() для создания таблицы, в которой первый столбец содержит порядковые номера строк:
print('№\tФамилия\tИмя\tВозраст') print('---------------------------------') for index, student in enumerate(students, start=1): print(f"\t\t\t")
В этом примере мы использовали функцию enumerate() для перечисления строк списка students с начальным значением 1, чтобы порядковые номера строк начинались с 1 вместо 0.
Затем мы использовали элементы каждой строки списка students для заполнения столбцов таблицы.
Результат работы программы:
№ Фамилия Имя Возраст --------------------------------- 1 Хайлодов Максим 19 2 Тудейкин Константин 20 3 Хмуроутров Илья 18 4 Шизобрякин Валентин 22
Узнай больше про Python и стань опытным Python-разработчиком за 4 месяца на курсе от Mate Academy. Учиться можно бесплатно и платить уже после получения работы.
Нахождение индексов минимального и максимального значений в числовой последовательности
Используем enumerate() в Python для поиска индексов минимального и максимального значений в списке чисел.
1. Сначала подготовим переменные
Допустим, исходная числовая последовательность представлена списком чисел numbers . Укажем это в коде, а затем инициализируем переменные min_value и max_value значением первого элемента списка numbers . Переменным min_index и max_index присвоим значение 0.
2. Приступаем к поиску
Используем цикл for для перебора элементов списка numbers с помощью функции enumerate() . На каждой итерации сравниваем текущий элемент с переменными min_value и max_value :
- если текущий элемент меньше min_value , то обновляем значения переменных min_value и min_index ;
- если текущий элемент больше max_value , то обновляем значения переменных max_value и max_index .
Выводим результаты поиска с помощью строкового форматирования.
Весь код на Python:
numbers = [5, 2, 7, 1, 9, 3] # Создаем список чисел numbers min_value, max_value = float('inf'), float('-inf') # Инициализируем переменные min_value и max_value значением первого элемента списка numbers min_index, max_index = None, None # Инициализируем переменные min_index и max_index значением 0 for index, number in enumerate(numbers): # Используем цикл для перебора элементов списка numbers с помощью функции enumerate() if number < min_value: min_value = number min_index = index if number >max_value: max_value = number max_index = index print(f"Минимальное значение находится на позиции ") print(f"Максимальное значение находится на позиции ")
После выполнения получаем информацию о том, находятся ли минимальное и максимальное значения на нужных позициях в списке:
Минимальное значение 1 находится на позиции 3 Максимальное значение 9 находится на позиции 4
Есть и альтернативный вариант решения этой же задачи:
numbers = [5, 2, 8, 1, 9, 4, 6, 3, 7] # Находим индекс минимального значения с помощью функции min() и передавая в качестве # функции сравнения lambda-функцию, которая возвращает второй элемент кортежа min_index, min_value = min(enumerate(numbers), key=lambda x: x[1]) # Находим индекс максимального значения аналогичным способом, но уже передаем lambda-функцию # для поиска максимального значения max_index, max_value = max(enumerate(numbers), key=lambda x: x[1]) # Выводим результаты print(f"Минимальное значение находится на позиции ") print(f"Максимальное значение находится на позиции ")
Как видим, код существенно короче и проще, за счет использования лямбда-функции:
- Первая строка создает список numbers , который мы будем использовать для поиска минимального и максимального значений.
- Во второй строке мы используем функцию min() , чтобы найти минимальное значение в списке. Мы передаем ей результат функции enumerate(numbers) , которая создает кортежи из пар (индекс, значение) для каждого элемента списка.
- Затем мы передаем функцию-сравнения lambda x: x[1] , которая возвращает второй элемент кортежа (то есть значение элемента), по которому будет производиться сравнение. Результат функции min() состоит из кортежа (индекс, значение), который мы распаковываем в две переменные min_index и min_value .
- Аналогичным образом мы находим индекс и значение максимального элемента в списке с помощью функции max() , передавая ей результат функции enumerate(numbers) и ту же самую лямбда-функцию для поиска максимального значения
В конце кода мы выводим на экран результаты, используя значения min_index , min_value , max_index и max_value :
Минимальное значение 1 находится на позиции 3 Максимальное значение 9 находится на позиции 4
Пример работы с информацией из базы данных
Функцию enumerate() легко можно использовать для обращения к информации из базы данных (БД).
Допустим, у нас есть БД с таблицей users . Таблица включает информацию о пользователях с такими полями:
Мы можем получить данные из этой таблицы в виде списка кортежей и использовать enumerate() для обхода каждого кортежа в списке и извлечения нужных данных по индексу:
import sqlite3 # подключаемся к базе данных conn = sqlite3.connect('example.db') # получаем курсор для выполнения запросов cur = conn.cursor() # получаем данные из таблицы users cur.execute("SELECT * FROM users") rows = cur.fetchall() # обходим каждый кортеж в списке rows, используя enumerate() for i, row in enumerate(rows): user_id = row[0] first_name = row[1] last_name = row[2] address = row[3] phone = row[4] # выводим данные на экран print(f"Пользователь : , адрес: , телефон: ") # закрываем соединение с базой данных conn.close()
Код выше подключается к базе данных example.db , получает все данные из таблицы users , обходит каждый кортеж в списке rows , извлекает нужные данные по индексу и выводит их на экран.
Пример извлечения данных по индексу из CSV-файла
Допустим, вы работаете с компанией, данные о покупках в которой хранятся в CSV-файле. Каждая строка файла содержит информацию о конкретной покупке и включает:
- id покупки;
- название товара;
- цену;
- количество.
Наша задача — это извлечь название товара и количество из каждой строки и вывести их на экран.
Для этой задачи удобно использовать функцию Python enumerate() :
import csv with open('purchases.csv', newline='') as csvfile: reader = csv.reader(csvfile, delimiter=',') for i, row in enumerate(reader): name = row[1] quantity = int(row[3]) print(f"Покупка : ( шт.)")
В этом коде мы открываем файл purchases.csv с помощью модуля csv.reader() , а затем используем функцию enumerate() для обхода каждой строки файла.
csv.reader() — это модуль Python, предназначенный для чтения данных из CSV-файлов. Он не только читает данные из файлов CSV, но и преобразовывает их в списки или кортежи Python. Также этот модуль содержит функции и методы для записи данных в CSV-файлы.
Мы извлекаем нужные данные по индексу (название товара находится во втором столбце, а количество — в четвертом), а затем выводим их на экран.
Внутри цикла мы также используем переменную i , чтобы отслеживать порядковый номер каждой покупки и выводить его вместе с данными.
Заключение
Функция enumerate() может значительно упростить процесс итерации по данным и повысить читабельность кода. Она позволяет получать индексы и значения элементов из коллекций данных , таких как списки, кортежи и строки.
При использовании enumerate() нужно учитывать некоторые ее особенности. Например, начальный индекс и использование распаковки кортежей.
Если использовать функцию enumerate() вместе с циклом for , каждый элемент итерируемой последовательности будет возвращаться как кортеж, состоящий из индекса элемента и самого элемента. Распаковка кортежа может быть использована, чтобы получить доступ к этим значениям отдельно.
Для закрепления изложенного материала предлагаем вам посмотреть видео, где рассказывается для чего нужна функция enumerate() , а также объясняется как она используется в цикле for при переборе элементов итерируемых объектов:
Для обучения Python в совершенстве, рекомендуем рассмотреть профессиональные курсы. Если вы в Киеве, освоить профессию Python-разработчика можно в компьютерной академии IT Step.