Printing lists in columns (was: TypeError: 'module object is not callable')

Duncan Booth duncan.booth at invalid.invalid
Tue Sep 4 09:06:38 EDT 2007


cjt22 at bath.ac.uk wrote:

>> But watch out if the lists aren't all the same length: zip won't pad out
>> any sequences, so it maynotbe exactly what is wanted here:
>>
>> >>> x = ['1', '2', '3']
>> >>> y = ['4', '5']
>> >>> for row in zip(x,y):
>>
>>         print ', '.join(row)
>>
>> 1, 4
>> 2, 5
>>
> 
> Unfortunately the lists will be of different sizes

In that case use:

from itertools import repeat, chain, izip
def izip_longest(*args, **kwds):
    fillvalue = kwds.get('fillvalue')
    def sentinel(counter = ([fillvalue]*(len(args)-1)).pop):
        yield counter()         # yields the fillvalue, or raises IndexError
    fillers = repeat(fillvalue)
    iters = [chain(it, sentinel(), fillers) for it in args]
    try:
        for tup in izip(*iters):
            yield tup
    except IndexError:
        pass

        
x = ['1', '2', '3']
y = ['4', '5']
for row in izip_longest(x,y, fillvalue='*'):
    print ', '.join(row)


which gives:
	
1, 4
2, 5
3, *


(izip_longest is in a future version of itertools, but for 
now you have to define it yourself).




More information about the Python-list mailing list