Skip to content

Instantly share code, notes, and snippets.

@rossmacarthur
Created November 29, 2018 12:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rossmacarthur/344d1fc43e80b64029f31379b0d1e865 to your computer and use it in GitHub Desktop.
Save rossmacarthur/344d1fc43e80b64029f31379b0d1e865 to your computer and use it in GitHub Desktop.
A windowed iterator with a configurable window and step size in Python.
class Window:
def __init__(self, *args, window=2, step=1):
self.iterator = iter(*args)
self.window = window
self.step = step
self.buffer = ()
def __iter__(self):
return self
def __next__(self):
if not self.buffer:
for _ in range(self.window):
self.buffer += (next(self.iterator),)
else:
new_elements = ()
for _ in range(self.step):
new_elements += (next(self.iterator),)
self.buffer = self.buffer[self.step:] + new_elements
return self.buffer
# Examples
iterator = Window([1, 2, 3, 4, 5], window=2, step=1)
assert next(iterator) == (1, 2)
assert next(iterator) == (2, 3)
assert next(iterator) == (3, 4)
assert next(iterator) == (4, 5)
iterator = Window([1, 2, 3, 4, 5], window=3, step=1)
assert next(iterator) == (1, 2, 3)
assert next(iterator) == (2, 3, 4)
assert next(iterator) == (3, 4, 5)
iterator = Window([1, 2, 3, 4, 5], window=2, step=2)
assert next(iterator) == (1, 2)
assert next(iterator) == (3, 4)
iterator = Window([1, 2, 3, 4, 5], window=3, step=2)
assert next(iterator) == (1, 2, 3)
assert next(iterator) == (3, 4, 5)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment