Итерация по двум элементам списка в Python: цикл for, comprehension
Пройдите тест, узнайте какой профессии подходите
Эффективный метод
Для эффективной итерации по элементам списка по парам используйте функцию range
с применением срезов и шага 2
:
my_list = ['a', 'b', 'c', 'd']
for i in range(0, len(my_list), 2):
print(my_list[i:i+2])
Вывод будет содержать следующие пары элементов:
['a', 'b']
['c', 'd']
Этот подход прекрасно справляется с списками, содержащими нечетное количество элементов, и не вызывает IndexError
.
Углубленный взгляд на работу с парами элементов
Рассмотрим несколько более продвинутых способов итерации по парам элементов списка.
Пары с помощью zip и срезов
Чтобы получить пары элементов, используйте срезы для разбиения исходного списка на четные и нечетные элементы, а затем примените функцию zip
:
for x, y in zip(my_list[::2], my_list[1::2]):
print(f"{x}, {y}")
Использование модуля itertools
В Python версии 3.10 и выше для итерации по парам без создания промежуточных списков используйте функцию pairwise
из модуля itertools
:
from itertools import pairwise
for a, b in pairwise(my_list):
print(f"{a}, {b}")
Создание собственных итераторов для лучшего контроля
Если требуется большая гибкость в управлении процессом итерации, можно создать функцию-генератор:
def paired(iterable):
it = iter(iterable)
while True:
yield next(it), next(it)
for x, y in paired(my_list):
print(f"{x}, {y}")
Для гарантированной работы включите вызов next(it)
в блок try-except
.
Ожидаемые проблемы и их решения
Следите за границами итерации с помощью next()
. Используйте itertools
с умом. Внесение типов может улучшить читаемость кода.
Визуализация
Приведем аналогию с очередью в магазине:
Очередь: [🍏, 🍎, 🍌, 🍊, 🍇, 🍓]
Итерация по парам покупателей, как в пункте самообслуживания:
for item1, item2 in zip(queue[::2], queue[1::2]):
self_checkout(item1, item2)
На каждом шаге цикла обрабатываются очередные два покупателя из очереди.
Советы для кода Python 2.x
Для работы с кодом на Python 2 используйте itertools.izip
вместо zip
:
from itertools import izip
for x, y in izip(my_list[::2], my_list[1::2]):
print(f"{x}, {y}")
Если pairwise()
недоступен, то more_itertools.chunked
является отличной альтернативой:
from more_itertools import chunked
for chunk in chunked(my_list, 2):
print(chunk)
Применение функционального программирования
С помощью функций map
и zip
, вы можете применить функцию ко всем парам:
def add(x, y):
return x + y
results = map(add, my_list[::2], my_list[1::2])
print(list(results))
Такой подход показывает применение функционального стиля программирования в Python.
Полезные ссылки
- 9. Классы — Документация Python 3.12.1 — официальная документация Python по итераторам.
- Python zip() — подробности о функции
zip
. - Что делает ключевое слово "yield" в Python? — разъяснение
yield
. - Итерация по парам элементов в списке — советы от профессиональных Python-разработчиков.
- Itertools в Python 3, Примеры использования — обзор возможностей
itertools
. - More Itertools — расширенные возможности
itertools
. - Enumerate() в Python — разбор функции
enumerate
.