from collections import deque
def window(seq, n=2):
it = iter(seq)
win = deque((next(it, None) for _ in xrange(n)), maxlen=n)
yield win
append = win.append
for e in it:
append(e)
yield win
a=[1,2,3]
b=[2,4,6]
for d in zip(window(a,2),window(b,2)):
print d
raw_input("Press Enter to continue...")
(deque([2, 3], maxlen=2), deque([4, 6], maxlen=2))
Press Enter to continue...
(deque([2, 3], maxlen=2), deque([4, 6], maxlen=2))
Press Enter to continue...
a
b
(deque([1, 2], maxlen=2), deque([2, 4], maxlen=2))
Press Enter to continue...
(deque([2, 3], maxlen=2), deque([4, 6], maxlen=2))
Press Enter to continue...
window
zip
def window(seq, n=2):
it = iter(seq)
win = deque((next(it, None) for _ in xrange(n)), maxlen=n)
yield list(win)
append = win.append
for e in it:
append(e)
yield list(win)
To avoid zipping the two iterables before beginning the loop,
use itertools.izip
instead of zip
in Python2:
import itertools as IT
import collections
def window(seq, n=2):
it = iter(seq)
win = collections.deque((next(it, None) for _ in range(n)), maxlen=n)
yield win
append = win.append
for e in it:
append(e)
yield win
a=[1,2,3]
b=[2,4,6]
for d in IT.izip(window(a,2),window(b,2)):
print(d)
yields
[deque([1, 2], maxlen=2), deque([2, 4], maxlen=2)]
[deque([2, 3], maxlen=2), deque([4, 6], maxlen=2)]
In Python3, zip
returns an iterator (identical to itertools.izip
in Python2). This is why the code you posted already works in Python3 without changes.