enumerate()
Введение | |
Синтаксис | |
Пример | |
Разбор | |
Удаление строк по номеру | |
Похожие статьи |
Введение
В этой статье вы узнаете как работает функция 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", "eth1.ru"] 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, 'eth1.ru'), 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