from collections import deque
class splitby:
# [''.join(s) for s in splitby('AAAABBBCCDAABBB', operator.eq)] --> ['AAAA', 'BBB', 'CC', 'D', 'AA', 'BBB']
def __init__(self, iterable, splitter):
self.splitfunc = splitter
self.it = iter(iterable)
self.segment = None
def __iter__(self):
return self
def __next__(self):
if self.segment:
deque(self.segment, maxlen=0)
if self.segment is None:
raise StopIteration
else:
self.curvalue = next(self.it)
self.segment = self._splitter()
return self.segment
def _splitter(self):
split = False
while not split:
yield self.curvalue
prev = self.curvalue
try:
self.curvalue = next(self.it)
except StopIteration:
self.segment = None
return
split = self.splitfunc(prev, self.curvalue)
from operator import gt
x = [1, 2, 3, 4, 1, 2, 3, 1, 2, 1]
print([list(s) for s in splitby(x, gt)])
ZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKIApjbGFzcyBzcGxpdGJ5OgogICAgIyBbJycuam9pbihzKSBmb3IgcyBpbiBzcGxpdGJ5KCdBQUFBQkJCQ0NEQUFCQkInLCBvcGVyYXRvci5lcSldIC0tPiBbJ0FBQUEnLCAnQkJCJywgJ0NDJywgJ0QnLCAnQUEnLCAnQkJCJ10KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpdGVyYWJsZSwgc3BsaXR0ZXIpOgogICAgICAgIHNlbGYuc3BsaXRmdW5jID0gc3BsaXR0ZXIKICAgICAgICBzZWxmLml0ID0gaXRlcihpdGVyYWJsZSkKICAgICAgICBzZWxmLnNlZ21lbnQgPSBOb25lCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKICAgIGRlZiBfX25leHRfXyhzZWxmKToKICAgICAgICBpZiBzZWxmLnNlZ21lbnQ6CiAgICAgICAgICAgIGRlcXVlKHNlbGYuc2VnbWVudCwgbWF4bGVuPTApCiAgICAgICAgICAgIGlmIHNlbGYuc2VnbWVudCBpcyBOb25lOgogICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VydmFsdWUgPSBuZXh0KHNlbGYuaXQpCiAgICAgICAgc2VsZi5zZWdtZW50ID0gc2VsZi5fc3BsaXR0ZXIoKQogICAgICAgIHJldHVybiBzZWxmLnNlZ21lbnQKICAgIGRlZiBfc3BsaXR0ZXIoc2VsZik6CiAgICAgICAgc3BsaXQgPSBGYWxzZQogICAgICAgIHdoaWxlIG5vdCBzcGxpdDoKICAgICAgICAgICAgeWllbGQgc2VsZi5jdXJ2YWx1ZQogICAgICAgICAgICBwcmV2ID0gc2VsZi5jdXJ2YWx1ZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmN1cnZhbHVlID0gbmV4dChzZWxmLml0KQogICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgICAgIHNlbGYuc2VnbWVudCA9IE5vbmUKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBzcGxpdCA9IHNlbGYuc3BsaXRmdW5jKHByZXYsIHNlbGYuY3VydmFsdWUpCiAKZnJvbSBvcGVyYXRvciBpbXBvcnQgZ3QKeCA9IFsxLCAyLCAzLCA0LCAxLCAyLCAzLCAxLCAyLCAxXQpwcmludChbbGlzdChzKSBmb3IgcyBpbiBzcGxpdGJ5KHgsIGd0KV0p