multirember&co

attn.steven.kuo at gmail.com attn.steven.kuo at gmail.com
Fri Apr 20 01:26:17 CEST 2007


On Apr 19, 3:37 pm, Anton Vredegoor <anton.vredeg... at gmail.com> 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




More information about the Python-list mailing list