enumerate()

Содержание
Введение
Синтаксис
Пример
Разбор
Удаление строк по номеру
Alt Caps: Чередование заглавных букв
Похожие статьи

Введение

В этой статье вы узнаете как работает функция enumerate() в Python 3.

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

Если хотите повторить примеры из статьи - создайте файл enumerate_demo.py и копируйте туда код из примеров.

Запустить файл можно командой

python3 enumerate_demo.py

Синтаксис

enumerate(iterable, start=0)

Официальная документация

Return an enumerate object. iterable must be a sequence, an iterator, or some other object which supports iteration.

The __next__() method of the iterator returned by enumerate() returns a tuple containing a count (from start which defaults to 0) and the values obtained from iterating over iterable.

>>> 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')]

Equivalent to:

def enumerate(iterable, start=0): n = start for elem in iterable: yield n, elem n += 1

Пример

Пройдёмся функцией enumerate() по списку и заодно убедимся, что возвращаются кортежи (tuple)

sites = ["heihei.ru", "topbicycle.ru", "urn.su"] for site in enumerate(sites): print(f"site: {site}, type(site): {type(site)}")

site: (0, 'heihei.ru'), type(site): <class 'tuple'> site: (1, 'topbicycle.ru'), type(site): <class 'tuple'> site: (2, 'urn.su'), type(site): <class 'tuple'>

Подробности

Разберём способы итерации по объектам списка

letters = ['a', 'b', 'c', 'd', 'e'] for letter in letters: print(letter)

python enumerate_demo.py

a b c d e

Если нужно показать не только элемент, но и его индекс - это легко сделать вручную, добавив переменную.

index = 0 letters = ['a', 'b', 'c', 'd', 'e'] for letter in letters:     print(index, letter)     index += 1

0 a 1 b 2 c 3 d 4 e

В качестве альтернативы можно использовать range() или while в сочетании с len()

for index in range(len(letters)):     print('letters[', index, '] =', letters[index]) # или index = 0 while index < len(letters): print('letters[', index, '] =', letters[index]) index += 1

python enumerate_demo.py

letters[ 0 ] = a letters[ 1 ] = b letters[ 2 ] = c letters[ 3 ] = d letters[ 4 ] = e

Чтобы пользоваться одновременно двумя переменными используется функция enumerate()

for index, item in enumerate(letters): print('letters', index, '=', item)

python enumerate_demo.py

letters 0 = a letters 1 = b letters 2 = c letters 3 = d letters 4 = e

enumerate() возвращает итератор (iterator) , в котором можно итерировать по последовательности кортежей (tuple) вида (index, item)

Чтобы лучше понять происходящее добавьте в скрипт следующий код

enum_obj = enumerate(letters) print(next(enum_obj)) print(next(enum_obj)) print(next(enum_obj)) print(type(enum_obj))

(0, 'a') (1, 'b') (2, 'c') <class 'enumerate'>

Пример применения enumerate() вместе с glob для поиска и подсчёта файлов.

Удаление строк по номеру

Чтобы лучше понять этот пример, нужно освоить материал статьи «Основы работы с файлами в Python»

Если из какого-то файла нужно удалить определённый диапазон строк - enumarate() придётся очень кстати.

Рассмотрим файл sample.txt

cat sample.txt

First line Second line Third line Fourth line Fifth line Sixth line Seventh line Eighth line

Чтобы удалить строки 4 и 7 воспользуемся скриптом

# list to store file lines lines = [] path = "sample.txt" # Read file with open(path, 'r') as f: # read an store all lines into list lines = f.readlines() # Write file with open(path, 'w') as f: # iterate each line for number, line in enumerate(lines): # delete line 5 and 8. or pass any Nth line you want to remove # note list index starts from 0 if number not in [4, 7]: f.write(line)

python delete.lines.py
cat sample.txt

First line Second line Third line Fourth line Sixth line Seventh line

Alt Caps

С помощью enumerate() можно сделать чередование заглавных и строчных букв.

В англоязычном интернете это называется Alt Caps и обычно обозначает иронию. В этом примере, я безо всякой иронии прошу вас подписаться на мой телеграм канал aofeed

def alt_caps(s: str) -> str: temp: list[str] = [] for i,c in enumerate(s): if i % 2 == 0: temp.append(c.upper()) else: temp.append(c.lower()) return ''.join(temp) if __name__ == '__main__': text: str = 'Subscribe to t.me/aofeed' print(alt_caps(text))

python alt_caps.py

SuBsCrIbE To t.mE/AoFeEd