Welcome, guest | Sign In | My Account | Store | Cart
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)

History