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