При работе с генераторами, где вам нужен некоторый контекст, я часто использую приведенную ниже служебную функцию, чтобы получить вид скользящего окна на итераторе:
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()
Будет сгенерировано представление последовательности N элементов за раз, смещаясь на шаг вперед. например.
>>> list(window([1,2,3,4,5],3))
[(1, 2, 3), (2, 3, 4), (3, 4, 5)]
При использовании в ситуациях, когда вам не хватает времени, когда вам также нужно иметь дело с числами, не имея следующего или предыдущего значения, вы можете дополнить последовательность соответствующим значением, таким как 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)