John Machin wrote:
> Matimus wrote:
> > unexpected wrote:
> > > If have a list from 1 to 100, what's the easiest, most elegant way to
> > > print them out, so that there are only n elements per line.
> > >
> > > So if n=5, the printed list would look like:
> > >
> > > 1 2 3 4 5
> > > 6 7 8 9 10
> > > 11 12 13 14 15
> > > etc.
> > >
> > > My search through the previous posts yields methods to print all the
> > > values of the list on a single line, but that's not what I want. I feel
> > > like there is an easy, pretty way to do this. I think it's possible to
> > > hack it up using while loops and some ugly slicing, but hopefully I'm
> > > missing something
> >
> > I suppose 'elegance' is in the eye of the beholder. I agree with the
> > previous posts, a readable for loop is probably the best way to go.
> > I've instead chosen to use the functional paradigm. I thought someone
> > might appreciate this:
> >
> > p = sys.stdout.write
> > map(p,[str(i)+("\n"+" "*(n-1))[i%n] for i in range(1,101)])
>
> At least three strikes:
>
> 1. The functional paradigm AFAIK abjures side effects.
>
> |>>> n = 3
> |>>> map(p,[str(i)+("\n"+" "*(n-1))[i%n] for i in range(1,11)])
> 1 2 3
> 4 5 6
> 7 8 9
> 10 [None, None, None, None, None, None, None, None, None, None]
>
> If you want functional, instead of
>     map(sys.stdout.write, strings)
> do this:
>     sys.stdout.write(''.join(strings))
>
> 2.  This little gem
>     ("\n"+" "*(n-1))[i%n]
> is better written
>     " \n"[i%n==0]
>
> 3. Like some other attempts, it's missing the trailing \n when len(seq)
> % n != 0
>
> 4. It needs elaboration so that it works with any sequence, not just
> range(1, size+1)
>
> Yer out!
>
> Cheers,
> John

Well, I have another at bat, so I will try to redeem myself... using
recursion:

def printTable(l,c):
    print(("%d "*len(l[:c]))%tuple(l[:c]))
    if( len(l[:c]) > 0 ):
        printTable(l[c:],c)

printTable(range(1,101),5)

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to