Me: > Here's a clever, though not (in my opinion) elegant solution ... > This seems a bit more elegant, though the "replace" dictionary is > still a bit of a hack
Here's the direct approach without using itertools. Each list is iterated over only once. No test against a sequence element is ever made (either as == or 'is') and the end of the sequence exception is raised only once per input iterator. The use of a list for the flag is a bit of a hack. If the list has 1 element then its true, no elements then its false. By doing it this way I don't need one extra array and one extra indexing/enumeration. def zipfill(*seqs): count = len(seqs) seq_info = [(iter(seq), [1]) for seq in seqs] while 1: fields = [] for seq, has_data in seq_info: if has_data: try: fields.append(seq.next()) except StopIteration: fields.append(None) del has_data[:] count -= 1 else: fields.append(None) if count: yield fields else: break Hmm, it should probably yield tuple(fields) Andrew [EMAIL PROTECTED] -- http://mail.python.org/mailman/listinfo/python-list