itertools.izip brokeness

Duncan Booth duncan.booth at invalid.invalid
Tue Jan 3 09:30:36 EST 2006


Peter Otten wrote:

> from itertools import izip, chain, repeat
> 
> def prt_files (file1, file2):
>     file1 = chain(file1, repeat(""))
>     file2 = chain(file2, repeat(""))
>     for line1, line2 in iter(izip(file1, file2).next, ("", "")):
>         print line1.rstrip(), "\t", line2.rstrip()
>  
> which can easily be generalized for an arbitrary number of files.

Generalizing for an arbitrary number of files and for an arbitrary value to 
pad out the shorter sequences:

def paddedizip(pad, *args):
    terminator = [pad] * (len(args)-1)
    def padder():
        if not terminator:
            return
        t = terminator.pop()
        while 1:
            yield t
    return izip(*(chain(a, padder()) for a in args))

>>> for (p,q) in paddedizip(0,[1,2,3],[4,5]):
	print repr(p), repr(q)

	
1 4
2 5
3 0
>>> for (p,q) in paddedizip(0,[1,2,3],[4,5,6,7,8]):
	print repr(p), repr(q)

	
1 4
2 5
3 6
0 7
0 8
>>> for (p,q) in paddedizip("",[1,2,3],[4,5,6,7,8]):
	print repr(p), repr(q)

	
1 4
2 5
3 6
'' 7
'' 8
>>> for (p,q,r) in paddedizip(None,[1,2,3],[4,5,6,7,8],[9]):
	print repr(p), repr(q), repr(r)

	
1 4 9
2 5 None
3 6 None
None 7 None
None 8 None



More information about the Python-list mailing list