TGViewer
Библиотека питониста | Python, Django, Flask Библиотека питониста | Python, Django, Flask @pyproglib · 37.3K subscribers
Post #7335 3.27K
✔️ Улучшаем itertools.pairwise

Если вы когда-нибудь работали с последовательностями, вы почти наверняка сталкивались с ситуацией: нужно пройтись не по одному элементу, а по соседним. Для таких случаев в Python есть замечательная штука — itertools.pairwise.

Она берёт ваше "ABCD" и превращает это в:
("A", "B"), ("B", "C"), ("C", "D")


Звучит просто — и это реально спасает в куче сценариев. Например, можно легко посчитать, как менялся банковский баланс:
from itertools import pairwise

balance_history = [700, 1000, 800, 750]

for before, after in pairwise(balance_history):
print(after - before)


Но фокус вот в чём…

Иногда пары — это мало. Хочется тройки, четвёрки, пятёрки… словом, окно произвольного размера.

Вот здесь pairwise уже не поможет — поэтому мы собрали несколько аккуратных способов сделать «обобщённый pairwise», он же nwise().

✔️ Вариант 1 — через deque

Простой, понятный и работает на всём, что итерируется:
from collections import deque
from itertools import islice

def nwise(iterable, n):
iterable = iter(iterable)
window = deque(islice(iterable, n - 1), maxlen=n)
for value in iterable:
window.append(value)
yield tuple(window)


Использование:
nwise("ABCD", 3)
→ ("A","B","C"), ("B","C","D")


✔️ Вариант 2 — через tee

Такой «фокус с зеркалами»: создаём n независимых итераторов и сдвигаем каждый на свою позицию:
from itertools import islice, tee

def nwise(iterable, n):
iterators = tee(iter(iterable), n)
for idx, iterator in enumerate(iterators):
for _ in islice(iterator, idx):
pass
yield from zip(*iterators)


Выглядит почти магически, но работает честно.

✔️ Вариант 3 — рекурсивный (красивый)

Пожалуй, личный фаворит. Если присмотреться, можно заметить:
triplewise — это просто pairwise(pairwise(...)).

А значит, можно сделать рекурсию:
from itertools import pairwise

def nwise(iterable, n):
if n == 1:
yield from ((x,) for x in iterable)
return

for (head, *_), tail in pairwise(nwise(iterable, n - 1)):
yield (head, *tail)


Минимализм и элегантность.

🍷 Если вдруг придумаете способ лучше — пишите!

🔹 Курс «Программирование на языке Python»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека питониста

#буст
  • 👍 16
  • 🔥 7
  • ❤ 4
  • 😁 1
More from @pyproglib
  1. Oct 3, 2026📚Напоминаем про наш полный курс «Самоучитель по Python для начинающих» Мы написали и собр…
  2. Oct 2, 2026🎹 Что делать после ChatGPT? Следующий шаг — AI-агенты. Они не просто отвечают на запросы,…
  3. Sep 30, 2026🔥 Последний день для разработчиков AI уже пишет код. Теперь важнее научиться встраивать е…
  4. Sep 25, 2026🔥 Курс «ИИ для разработчиков» уже стартовал И мы решили открыть первое занятие всем — мож…
  5. Sep 20, 2026👻 94% токенов уходят не на код Анализ запусков показал: основная часть токенов уходит на…
  6. Sep 19, 2026📚Напоминаем про наш полный курс «Самоучитель по Python для начинающих» Мы написали и собр…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →