Advertisement
Guest User

Untitled

a guest
Jan 18th, 2014
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 0.87 KB | None | 0 0
  1. # http://stupidpythonideas.blogspot.com/2014/01/grouping-into-runs-of-adjacent-values.html
  2.  
  3. def adjacent_key(cutoff=1, key=None, predicate=None):
  4.     if key is None:
  5.         key = lambda v: v
  6.     if predicate is None:
  7.         def predicate(lhs, rhs):
  8.             return lhs - cutoff <= rhs <= lhs + cutoff
  9.     class K(object):
  10.         __slots__ = ['obj']
  11.         def __init__(self, obj):
  12.             self.obj = obj
  13.         def __eq__(self, other):
  14.             ret = predicate(key(self.obj), key(other.obj))
  15.             if ret:
  16.                 self.obj = other.obj
  17.             return ret
  18.     return K
  19.  
  20. def first_and_last(iterable):
  21.     start = end = next(iterable)
  22.     for end in iterable: pass
  23.     return start, end
  24.  
  25. def runs(iterable, *args, **kwargs):
  26.     for k, g in itertools.groupby(iterable, adjacent_key(*args, **kwargs)):
  27.         yield first_and_last(g)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement