more fun with iterators (mux, demux)
Neal Becker
ndbecker2 at gmail.com
Wed Apr 8 10:51:19 EDT 2009
pataphor wrote:
> On 07 Apr 2009 02:05:59 GMT
> Steven D'Aprano <steven at REMOVE.THIS.cybersource.com.au> wrote:
>
>> The demuxer can't be an iterator, since it needs to run through the
>> entire collection.
>
> Then your demuxer obviously cannot handle infinite sequences.
>
>> def demux(it, n):
>> collectors = [[] for i in xrange(n)]
>> i = 0
>> for item in it:
>> collectors[i].append(item)
>> i = (i+1) % n
>> return tuple([iter(x) for x in collectors])
>
> But this one can:
>
> from collections import deque
> from itertools import cycle, izip, count, islice
>
> def mux(*iterables):
> for it in izip(*iterables):
> for item in it:
> yield item
>
> def demux(seq,n):
> it = iter(seq)
> Q = [deque() for i in xrange(n)]
> CQ = cycle(Q)
> def gen(D):
> for x,C in izip(it,CQ):
> C.appendleft(x)
> while D:
> yield D.pop()
> while D:
> yield D.pop()
> return map(gen,Q)
>
> def test():
> a = count(10)
> b = count(20)
> c = count (30)
> x = demux(mux(a,b,c),3)
> for e in x:
> print list(islice(e,0,10))
>
> if __name__=='__main__':
> test()
>
> P.
> --
> http://mail.python.org/mailman/listinfo/python-list
What was wrong with this one?
def demux(iterable, n):
return tuple(islice(it, i, None, n) for (i, it) in
enumerate(tee(iterable, n)))
More information about the Python-list
mailing list