Cuando se trata de generadores en las que necesita un poco de contexto, que a menudo utilizan la función de utilidad más adelante para dar una visión de ventana deslizante en un iterador:
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()
Generará una vista de los elementos de la secuencia N en at Ie, cambiando de lugar de paso. p.ej.
>>> list(window([1,2,3,4,5],3))
[(1, 2, 3), (2, 3, 4), (3, 4, 5)]
Cuando se utiliza en la búsqueda hacia delante/detrás situaciones en las que también tienen que lidiar con los números sin tener un valor siguiente o anterior, es posible que desee almohadilla de la secuencia con un valor apropiado, tal como Ninguno.
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)
Podría hacer "prev, item = item, next" en este caso. –
Para hacer este ciclo infinitamente (sin StopIteration), haga 'from itertools import cycle' y cambie la segunda línea a:' iterator = cycle (iterable) ' –
¿Es menos pitónico utilizar enumerate en este contexto? – batbrat