Printing n elements per line in a list

John Machin sjmachin at lexicon.net
Wed Aug 16 19:28:13 EDT 2006


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




More information about the Python-list mailing list