logo

Итерация по двум элементам списка в Python: цикл for, comprehension

Эффективный метод

Для эффективной итерации по элементам списка по парам используйте функцию range с применением срезов и шага 2:

Python
Скопировать код
my_list = ['a', 'b', 'c', 'd']
for i in range(0, len(my_list), 2):
    print(my_list[i:i+2])

Вывод будет содержать следующие пары элементов:

Python
Скопировать код
['a', 'b']
['c', 'd']

Этот подход прекрасно справляется с списками, содержащими нечетное количество элементов, и не вызывает IndexError.

Углубленный взгляд на работу с парами элементов

Рассмотрим несколько более продвинутых способов итерации по парам элементов списка.

Пары с помощью zip и срезов

Чтобы получить пары элементов, используйте срезы для разбиения исходного списка на четные и нечетные элементы, а затем примените функцию zip:

Python
Скопировать код
for x, y in zip(my_list[::2], my_list[1::2]):
    print(f"{x}, {y}")

Использование модуля itertools

В Python версии 3.10 и выше для итерации по парам без создания промежуточных списков используйте функцию pairwise из модуля itertools:

Python
Скопировать код
from itertools import pairwise

for a, b in pairwise(my_list):
    print(f"{a}, {b}")

Создание собственных итераторов для лучшего контроля

Если требуется большая гибкость в управлении процессом итерации, можно создать функцию-генератор:

Python
Скопировать код
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 с умом. Внесение типов может улучшить читаемость кода.

Визуализация

Приведем аналогию с очередью в магазине:

Markdown
Скопировать код
Очередь: [🍏, 🍎, 🍌, 🍊, 🍇, 🍓]

Итерация по парам покупателей, как в пункте самообслуживания:

Python
Скопировать код
for item1, item2 in zip(queue[::2], queue[1::2]):
    self_checkout(item1, item2)

На каждом шаге цикла обрабатываются очередные два покупателя из очереди.

Советы для кода Python 2.x

Для работы с кодом на Python 2 используйте itertools.izip вместо zip:

Python
Скопировать код
from itertools import izip

for x, y in izip(my_list[::2], my_list[1::2]):
    print(f"{x}, {y}")

Если pairwise() недоступен, то more_itertools.chunked является отличной альтернативой:

Python
Скопировать код
from more_itertools import chunked

for chunk in chunked(my_list, 2):
    print(chunk)

Применение функционального программирования

С помощью функций map и zip, вы можете применить функцию ко всем парам:

Python
Скопировать код
def add(x, y):
    return x + y

results = map(add, my_list[::2], my_list[1::2])
print(list(results))

Такой подход показывает применение функционального стиля программирования в Python.

Полезные ссылки

    1. Классы — Документация Python 3.12.1
    — официальная документация Python по итераторам.
  1. Python zip() — подробности о функции zip.
  2. Что делает ключевое слово "yield" в Python? — разъяснение yield.
  3. Итерация по парам элементов в списке — советы от профессиональных Python-разработчиков.
  4. Itertools в Python 3, Примеры использования — обзор возможностей itertools.
  5. More Itertools — расширенные возможности itertools.
  6. Enumerate() в Python — разбор функции enumerate.