, , , , . , , , ..
, itertools . , - :
def divide_iter(pred, lst):
i = iter(lst)
yield itertools.takewhile(lst, pred)
yield i
, . , . , , takewhile , . , , , - , , , .
, . groupby - , , , True. , groupby:
import itertools
class _FoundTracker(object):
def __init__(self, predicate):
self.predicate = predicate
self._found = False
def check_found(self, value):
if self._found:
return True
else:
self._found = self.predicate(value)
return self._found
def split_iterable(iterable, predicate):
tracker = _FoundTracker(predicate)
for i, (k, group) in enumerate(itertools.groupby(iterable, key=tracker.check_found)):
yield group
if i == 0:
yield iter(())
if __name__ == '__main__':
for group in split_iterable(xrange(10), lambda x: x < 5):
print(list(group))
, , ... , :
g1, g2 = split_iterable(xrange(10), lambda x: x > 5)
print(list(g1))
print(list(g2))
, :-). :
g1, g2 = map(list, split_iterable(range(10), lambda x: x > 5))
print(g1)
print(g2)
.