can list comprehensions replace map?

Andrew Dalke dalke at dalkescientific.com
Fri Jul 29 11:38:32 EDT 2005


Peter Otten wrote:
> Combining your "clever" and your "elegant" approach to something fast
> (though I'm not entirely confident it's correct):
> 
> def fillzip(*seqs):
>     def done_iter(done=[len(seqs)]):
>         done[0] -= 1
>         if not done[0]:
>             return
>         while 1:
>             yield None
>     seqs = [chain(seq, done_iter()) for seq in seqs]
>     return izip(*seqs)

Ohh, that's pretty neat passing in 'done' via a mutable default argument.

It took me a bit to even realize why it does work.  :)

Could make it one line shorter with

from itertools import chain, izip, repeat
def fillzip(*seqs):
    def done_iter(done=[len(seqs)]):
        done[0] -= 1
        if not done[0]:
            return []
        return repeat(None)
    seqs = [chain(seq, done_iter()) for seq in seqs]
    return izip(*seqs)

Go too far on that path and the code starts looking likg

from itertools import chain, izip, repeat
forever, table = repeat(None), {0: []}.get
def fillzip(*seqs):
    def done_iter(done=[len(seqs)]):
        done[0] -= 1
        return table(done[0], forever)
    return izip(*[chain(seq, done_iter()) for seq in seqs])

Now add the performance tweak....

  def done_iter(done=[len(seqs)], forever=forever, table=table)

Okay, I'm over it.  :)

				Andrew
				dalke at dalkescientific.com




More information about the Python-list mailing list