← retour aux snippets

itertools: pairwise et fenêtrage glissant

Créer des couples consécutifs et des fenêtres de taille n efficacement.

objectif

Créer des couples consécutifs et des fenêtres de taille n efficacement.

code minimal

try:
    from itertools import pairwise  # Python 3.10+
except ImportError:
    def pairwise(iterable):
        it = iter(iterable)
        prev = next(it, None)
        for cur in it:
            yield (prev, cur)
            prev = cur

data = [1, 2, 3, 4]
print(list(pairwise(data)) == [(1,2),(2,3),(3,4)])  # attendu: True

utilisation

from collections import deque

def sliding_window(it, n):
    it = iter(it)
    d = deque(maxlen=n)
    for _ in range(n-1):
        d.append(next(it, None))
    for x in it:
        d.append(x)
        yield tuple(d)

print(list(sliding_window([1,2,3,4], 3)) == [(1,2,3),(2,3,4)])

variante(s) utile(s)

from itertools import islice

def batched(it, n):
    it = iter(it)
    while True:
        batch = tuple(islice(it, n))
        if not batch: break
        yield batch

print(list(batched(range(7), 3)) == [(0,1,2),(3,4,5),(6,)])

notes

  • pairwise est idéal pour détecter des changements entre éléments consécutifs.
  • Utilisez deque pour des fenêtres glissantes O(1) par étape.