On Apr 19, 3:37 pm, Anton Vredegoor <[EMAIL PROTECTED]> wrote: > Anton Vredegoor wrote: > > Maybe this one is better? > > No, this one keeps generating output. > > But this one stops at least: > > from collections import deque > from itertools import chain, repeat > > def xsplitter(seq, pred): > Q = deque(),deque() > sentinel = object() > it = chain(seq,repeat(sentinel)) > def gen(p): > for x in it: > if x is sentinel: > while Q[p]: yield Q[p].popleft() > break > elif pred(x) == p: > while Q[p]: yield Q[p].popleft() > yield x > else: > Q[~p].append(x) > for x in gen(p): yield x > return gen(1),gen(0) > > def test(): > L = 1, 2, 3, 'a', 'a' > # L = 'a', 1, 2, 'a' > # L = 1, 'a', 3, 'a', 4, 5, 6, 'a' > it1, it2 = xsplitter(L, lambda x: x == 'a') > print it1.next() > print it2.next() > print it1.next() > print it2.next() > > if __name__=='__main__': > test() > > Are there any other cases this doesn't cover? > > A.
This one gets the order wrong. With def test(): L = 1, 2, 3, 'a', 4, 'a', 5, 'a', 6, 'a' it1, it2 = xsplitter(L, lambda x: x == 'a') print it1.next() print it2.next() print it1.next() print it2.next() print it1.next() print it2.next() print it1.next() print it2.next() 5 will appear before 4. -- Regards, Steven -- http://mail.python.org/mailman/listinfo/python-list