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