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