Ich empfehle, hier das sogenannte String Formatting zu nutzen. Zuerst mal brauchst du eine Vorlage, die beschreibt, in welcher Art formatiert werden soll. Formatierungsanweisungen werden in geschweifte Klammern gesetzt. Bei deinem Anwendungsfall passt folgender Ausdruck:
Vor dem Doppelpunkt kann ein Index stehen, der also bezeichnet, das wievielte Element aus den später übergebenen Argumenten genutzt werden soll. Ab Python 2.7 kann der Index auch weggelassen werden, was hier sehr gelegen kommt. Die dann folgende Null ist das Füllzeichen, welches für die Leerstellen genutzt werden soll, die ja bei einstelligen Zahlen links von der Zahl verbleiben sollen. Als letztes kommt dann die Anzahl der Stellen, die eine übergebene Zahl später maximal haben wird. Hier also zwei. Ein paar Beispiele:
Code: Alles auswählen
>>> '{:02}'.format(5)
'05'
>>> '{:02}'.format(23)
'23'
>>> '{:02}'.format(0)
'00'
Ohne Füllzeichen:
Code: Alles auswählen
>>> '{:2}'.format(5)
' 5'
>>> '{:2}'.format(23)
'23'
>>> '{:2}'.format(0)
' 0'
Wieder mit Füllzeichen, aber drei Stellen:
Jetzt willst du aber 20 solcher Zahlen in einer Zeile haben. Weil ein Programmierer ja am liebsten möglichst lange darüber nachdenkt, wie er möglichst wenig schreiben muss, tippe auch ich die Dinger nicht hintereinander in die Vorlage, sondern nutze die Funktion zum Wiederholen von gleichen Ausgaben aus dem
itertools-Modul:
Code: Alles auswählen
>>> from itertools import repeat
>>> ' '.join(repeat('{:02}', 20))
'{:02} {:02} {:02} {:02} {:02} {:02} {:02} {:02} {:02} {:02} {:02} {:02} {:02} {:02} {:02} {:02} {:02} {:02} {:02} {:02}'
Wie unschwer zu erkennen ist, nimmt repeat() als erstes das auszugebene Resultat und als zweites die Anzahl an Wiederholungen. Die join()-Methode kombiniert die Ergebnisse mit Leerzeichen. Das Template (die Vorlage) ist also fertig und kann nun gefüllt werden:
Code: Alles auswählen
>>> from random import randint
>>> template = ' '.join(repeat('{:02}', 20))
>>> numbers = (randint(0,20) for number in xrange(20))
>>> template.format(*numbers)
'03 09 20 08 06 17 15 07 09 01 09 09 07 09 00 20 10 12 04 15'
Falls du nicht weißt, was da passiert: Die Klammern beim Erzeugen der Zufallszahlen sind ein Generator-Ausdruck. Das mit dem Stern in der letzten Zeile nennt sich Unpacking. Details dazu lassen sich bei Bedarf ergooglen oder in der Python-Doku nachlesen. Hoffe, die Anwendung ist einigermaßen klar geworden. Wie man dies nun für mehrere Zeilen zusammensetzt, schreibe ich vielleicht später noch. Was aber auch helfen kann, ist selber nachdenken.
EDIT:
Hier schon mal als Funktion für eine Zeile:
Code: Alles auswählen
>>> def get_randint_line(n=20, format='{:02}'):
... template = ' '.join(repeat(format, n))
... numbers = (randint(0,20) for number in xrange(n))
... return template.format(*numbers)
...
>>> get_randint_line()
'01 20 07 15 15 19 18 16 15 01 03 02 19 03 16 16 15 14 07 08'
>>> get_randint_line()
'12 18 18 20 04 04 15 13 09 05 20 20 07 13 11 12 14 17 14 04'
>>> get_randint_line()
'08 19 08 07 04 05 18 05 14 09 15 14 18 13 18 08 02 13 15 20'
>>> get_randint_line(10)
'08 07 04 13 20 11 03 05 17 03'
Und um das Ganze zu vervollständigen:
Code: Alles auswählen
>>> def get_formatted_randints(n=100, line_elems=20):
... lineno, leftover = divmod(n, line_elems)
... lines = [get_randint_line(line_elems) for line in xrange(lineno)]
... if leftover:
... lines.append(get_randint_line(leftover))
... return '\n'.join(lines)
...
>>> print get_formatted_randints(105)
18 11 01 04 20 10 17 04 15 06 03 14 05 11 09 03 12 13 20 18
07 16 20 16 06 12 20 10 04 04 15 10 04 08 13 20 03 05 14 05
10 01 00 17 17 01 08 05 05 00 01 16 20 04 03 11 15 05 03 17
10 00 08 16 06 14 11 07 18 04 05 06 10 06 03 14 05 20 16 11
04 17 16 09 12 20 13 04 19 18 18 16 09 08 20 08 05 16 19 15
04 13 00 12 04
>>> print get_formatted_randints(100)
19 06 19 04 10 18 13 09 07 02 10 06 06 14 14 16 02 02 03 20
01 09 14 12 09 20 12 13 02 02 08 14 19 03 06 00 04 18 04 15
09 05 06 04 03 13 20 03 00 20 15 20 14 06 09 09 17 20 12 09
05 08 07 06 12 10 19 20 19 07 13 09 04 14 01 06 18 20 14 08
20 09 08 03 05 17 11 02 19 13 02 17 18 19 04 04 19 02 06 08
Sicherlich lässt sich noch irgendwo was optimieren. Man könnte zum Beispiel das Template in einem Rutsch erzeugen, anstatt dies für jede Zeile zu machen. Darauf habe ich aber gerade nun wirklich keine Lust mehr.