Verfasst: Dienstag 5. Januar 2010, 20:54
Klar, bei undefinierter Vorgabe der Anzahl der Zeilen muss man rjust in Abhängigkeit der Digits der grössten Zahl wählen. Ist aber bei der Hausaufgabe nicht nötig.
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Code: Alles auswählen
def pretty_print(pd):
item_length = len(str(pd[-1][len(pd[-1])/2]))
line_length = (item_length + 1) * (len(pd[-1]) + 1)
space = " " * item_length
for line in pd:
print space.join(map(str, line)).center(line_length)
Code: Alles auswählen
# -*- coding: utf-8 -*-
"""
Spyder Editor
This temporary script file is located here:
/home/michael/.spyder/.temp.py
"""
print 'Wieviele Zeilen?' #Ausgabe: Wieviele Zeilen
lines = raw_input() #Warte auf eingabe
lines = int(lines) #Wandelt die Eingabe in Integer um
lines = range(lines) #Erstellt eine Liste mit lines zahlen ab 0 (bei lines = 9, [0,1,2,3,4,5,6,7,8]
pascal_list = [] #Erstellt eine leere Liste
for line in lines: #Für jedes Element (line) in der liste lines...
pascal_list.append([1]) #Fügt man eine Liste mit dem Startinhalt [1] an die pascal_list an. Dadurch wird eine 2-Dimensionale Liste erstellt.
if line != 0: #Die Erste (0te) Zeile ist bereits mit der 1 fertig ausgefüllt, darum wird das weitere nur durchlaufen wenn es sich nicht um diese handelt
for element in range(len(pascal_list[line-1])): #es wird eine Liste mit Zahlen 0 - n erstellt, mit der länge der vohergehenden Zeile. Für jedes element dieser Zeile wird die Schleife durchlaufen.
pascal_list[line].append(sum(pascal_list[line-1][element:element+2])) #Der Aktuellen Zeile (pascal_list[line]) wird die Summe der Zahlen des elements und des nachfolgenden, aus der vohergehenden Zeile angehängt. Die Variable element ist der Index.
rev_lines = lines #die Liste lines (siehe oben) wird kopiert
rev_lines.reverse() #Die kopie wird umgekehrt.
for n in range(len(rev_lines)): #Schwachsinn. Kannst anstelle range(len(rev_lines)) auch lines verwenden. Ich erstelle hier eine Liste von 0-n mit der länge von rev_lines. Die liste ist aber mit lines dann identisch. Letztendlich brauch ich n als index für die zu bearbeitende Zeile von pascal_list.
pascal_print = '' #ein leerer String wird erstellt
for m in pascal_list[n]: #m wird nach und nach jedes element der Aktuellen Zeile.
if pascal_print == '': #wenn pascal_print noch ein leerer String ist, sollen keine zusätzlichen leerzeichen eingefügt werden.
pascal_print = str(m) #es wird also einfach nur das element, als String angehängt.
else:
pascal_print = pascal_print + ' '*(6-len(str(m))) + str(m) #ansonsten sollen die Leerzeichen eingefügt werden. und zwar 6 stück, abzüglich der Anzahl der Zeichen. Da m INT ist, und darum die länge nicht ermittelt werden kann, wandle ich es (Kopf duch die Wand) in einen sting um. Dann wird noch m als string angehängt.
print ' '*(rev_lines[n]) + pascal_print #zuletzt werden noch - und dafür brauchte ich die umgekehrte liste der Zeilenzahl lehrzeichen eingefügt, um die gesammte Zeile einzurücken. Je weiter oben, desto mehr. Bei 10 Zeilen wird die oberste jetzt 9x soviel eingerückt wie die unterste. Die unterste wird 3*0, die oberste 3*9. Nach der Einrückung wird dann der erstellte String ausgegeben.
Ich habe es so gelöst:Hyperion hat geschrieben:Hier mal mein "pretty_print":
Code: Alles auswählen
def __str__(self):
b, n = len(str(max(self.dreieck[-1])+1)), len(self.dreieck)
return "\n".join(" "*((b+1)*(n-k)//2)+" ".join("%*s" %(b,w) for w in zeile)
for k,zeile in enumerate(self.dreieck))
Code: Alles auswählen
item_length = len(str(max(pd[-1])))
Da der größte Wert immer in der Mitte ist, dürfte man auch mit direkt reinindizieren bei len/2 Erfolg haben.Hyperion hat geschrieben:Patsch! Auf das max() hätte ich auch mal kommen sollen ^^
Ist aber mit max() eleganter finde ich.hendrikS hat geschrieben:Da der größte Wert immer in der Mitte ist, dürfte man auch mit direkt reinindizieren bei len/2 Erfolg haben.Hyperion hat geschrieben:Patsch! Auf das max() hätte ich auch mal kommen sollen ^^
Code: Alles auswählen
#!/usr/bin/env python
from itertools import chain, imap, islice
from operator import add
def iter_rows():
row = one = [1]
while True:
yield row
row = list(chain(one, imap(add, row, islice(row, 1, None)), one))
def print_triangle(rows):
last_row = rows[-1]
last_row_length = len(last_row)
max_number_width = len(str(last_row[last_row_length // 2]))
line_width = (max_number_width + 1) * last_row_length
print
for row in rows:
print (' '.join(str(i).rjust(max_number_width) for i in row)
.center(line_width))
def main():
rows = list(islice(iter_rows(), int(raw_input('Wie viele Zeilen? '))))
print_triangle(rows)
print '-' * 40
if __name__ == '__main__':
main()