Lorsque je traite des générateurs pour lesquels vous avez besoin d'un certain contexte, j'utilise souvent la fonction utilitaire ci-dessous pour donner une vue en fenêtre glissante sur un itérateur :
import collections, itertools
def window(it, winsize, step=1):
"""Sliding window iterator."""
it=iter(it) # Ensure we have an iterator
l=collections.deque(itertools.islice(it, winsize))
while 1: # Continue till StopIteration gets raised.
yield tuple(l)
for i in range(step):
l.append(it.next())
l.popleft()
Il générera une vue de la séquence de N éléments à la fois, en décalant les étapes. par exemple.
>>> list(window([1,2,3,4,5],3))
[(1, 2, 3), (2, 3, 4), (3, 4, 5)]
Dans les situations de lookahead/behind où vous devez également traiter des nombres sans valeur suivante ou précédente, vous pouvez compléter la séquence avec une valeur appropriée telle que None.
l= range(10)
# Print adjacent numbers
for cur, next in window(l + [None] ,2):
if next is None: print "%d is the last number." % cur
else: print "%d is followed by %d" % (cur,next)