import itertools
def offsetter(iterable, offsets=(0, 1), longest=False):
"""
Return offset element from an iterable.
Pad offset element with None at boundaries.
"""
# clone the iterable
clones = itertools.tee(iterable, len(offsets))
# set up the clone iterables
iterables = []
for offset, clone in zip(offsets, clones):
if offset > 0:
# fast forward the start
clone = itertools.islice(clone, offset, None)
elif offset < 0:
# pad the front of the iterable
clone = itertools.chain(itertools.repeat(None, -offset), clone)
else:
# nothing to do
pass
iterables.append(clone)
if longest:
return itertools.izip_longest(*iterables)
else:
return itertools.izip(*iterables)
Diff to Previous Revision
--- revision 1 2011-08-22 04:23:15
+++ revision 2 2012-04-16 13:08:55
@@ -1,6 +1,6 @@
import itertools
-def offsetter(iterable, offsets=(0, 1)):
+def offsetter(iterable, offsets=(0, 1), longest=False):
"""
Return offset element from an iterable.
Pad offset element with None at boundaries.
@@ -13,19 +13,18 @@
iterables = []
for offset, clone in zip(offsets, clones):
if offset > 0:
- # pad the end of the iterable and fast forward the start
- clone = itertools.chain(
- itertools.islice(clone, offset, None), itertools.repeat(None, offset)
- )
+ # fast forward the start
+ clone = itertools.islice(clone, offset, None)
elif offset < 0:
- # pad the front of the iterable (tail will get cut by izip)
- clone = itertools.chain(
- itertools.repeat(None, -offset), clone
- )
+ # pad the front of the iterable
+ clone = itertools.chain(itertools.repeat(None, -offset), clone)
else:
# nothing to do
pass
iterables.append(clone)
- return itertools.izip(*iterables)
+ if longest:
+ return itertools.izip_longest(*iterables)
+ else:
+ return itertools.izip(*iterables)