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 [EMAIL PROTECTED] -- http://mail.python.org/mailman/listinfo/python-list