more fun with iterators (mux, demux)

Steven D'Aprano steven at REMOVE.THIS.cybersource.com.au
Mon Apr 6 22:05:59 EDT 2009


On Mon, 06 Apr 2009 20:05:51 -0400, Neal Becker wrote:

> I'm trying to make a multiplexor and demultiplexor, using generators. 
> The multiplexor will multiplex N sequences -> 1 sequence  (assume equal
> length). The demultiplexor will do the inverse.
> 
> The mux seems easy enough:
> 
> -----------------------
> def mux (*ranges):
>     iterables = [iter (r) for r in ranges] while (True):
>         for i in (iterables):
>             yield i.next()


This is like a zip, and can be re-written using itertools.izip.

def mux(*iterables):
    for i in itertools.izip(*iterables):
        for item in i:
            yield item


The demuxer can't be an iterator, since it needs to run through the 
entire collection.

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])



-- 
Steven




More information about the Python-list mailing list