Anton Vredegoor wrote: > [EMAIL PROTECTED] wrote: > >> Try it with >> >> def test(): >> L = 'a', 1, 2, 'a' >> it1, it2 = xsplitter(L, lambda x: x == 'a') >> print it1.next() >> print it2.next() >> print it1.next() >> print it2.next() >> >> >> The last print statement raises StopIteration... >> We, however, expected each iterator to contain >> two elements (one yielding 'a' then 'a', and >> the other yielding 1 then 2). > > Ouch! I never understood much about generators anyway.
How about this one? from collections import deque class sentinel(object): pass class myiter(object): def __init__(self,seq): self.seq = seq self.index = -1 def __iter__(self): return self def next(self): self.index +=1 if self.index < len(self.seq): return self.seq[self.index] else: return sentinel def mygen(seq): for x in seq: if x is sentinel: #way past bedtime raise StopIteration yield x def xsplitter(seq, pred): Q = deque(),deque() it = myiter(seq) def gen(p): for x in it: while Q[p]: yield Q[p].popleft() if pred(x) == p: yield x else: Q[~p].append(x) for x in gen(p): yield x return map(mygen,[gen(1),gen(0)]) def test(): L = 'a', 1, 2, '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() A. -- http://mail.python.org/mailman/listinfo/python-list