Pascalsches Dreieck mit python (dringend!)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
gamemaster2422
User
Beiträge: 8
Registriert: Dienstag 5. Januar 2010, 19:34

mein interpterer sagt mir dabei:
No module named pascaldreieck
meine programme sind nicht fehlerhaft...sie entwickeln nur zufällig neue features
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

gamemaster2422 hat geschrieben:da heißt es das from aus
from pascaldreieck import PascalDreieck
sei falsch.
Hast du den Post von DasIch nicht gelesen? Wahrscheinlich fehlt das Modul pascaldreieck.py in deinem site-packages-Ordner ... :D
gamemaster2422
User
Beiträge: 8
Registriert: Dienstag 5. Januar 2010, 19:34

und wo kriege ich das her?
meine programme sind nicht fehlerhaft...sie entwickeln nur zufällig neue features
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

numerix hat geschrieben:
gamemaster2422 hat geschrieben:da heißt es das from aus
from pascaldreieck import PascalDreieck
sei falsch.
Hast du den Post von DasIch nicht gelesen? Wahrscheinlich fehlt das Modul pascaldreieck.py in deinem site-packages-Ordner ... :D
Nun hört doch auf den OP zu verarschen - er hat den Witz halt nicht gecheckt ;-)
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Code: Alles auswählen

# -*- coding: utf-8 -*-
"""
Spyder Editor

This temporary script file is located here:
/home/michael/.spyder/.temp.py
"""


print 'Wieviele Zeilen?'
lines = raw_input()
lines = int(lines)
lines = range(lines)


pascal_list = []

for line in lines:
    pascal_list.append([1])
    if line != 0:
        for element in range(len(pascal_list[line-1])):
            pascal_list[line].append(sum(pascal_list[line-1][element:element+2]))

rev_lines = lines
rev_lines.reverse()
for n in range(len(rev_lines)):
    pascal_print = ''
    for m in pascal_list[n]:
        if pascal_print == '':
            pascal_print = str(m)
        else:
            pascal_print = pascal_print + ' '*(6-len(str(m))) + str(m)
    print '   '*(rev_lines[n]) + pascal_print

Hier noch mit Kopf durch die Wand...
Jetzt gibt es die Ausgabe auch als Dreieck :)

Code: Alles auswählen

                                 1
                              1     1
                           1     2     1
                        1     3     3     1
                     1     4     6     4     1
                  1     5    10    10     5     1
               1     6    15    20    15     6     1
            1     7    21    35    35    21     7     1
         1     8    28    56    70    56    28     8     1
      1     9    36    84   126   126    84    36     9     1
   1    10    45   120   210   252   210   120    45    10     1
1    11    55   165   330   462   462   330   165    55    11     1
Die 6-len(str(m)) muss man halt anpassen...
Wenn die Zahlen unten immer größer Werden, und irgendwann mehr als 6 Stellen haben, tuts weh.
Zuletzt geändert von ... am Dienstag 5. Januar 2010, 20:55, insgesamt 1-mal geändert.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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.
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Sry - habe keine Ahnung von Rjust oder sonstigem...
Ich bin auch nur ein kleiner Noob.
gamemaster2422
User
Beiträge: 8
Registriert: Dienstag 5. Januar 2010, 19:34

@...
könntest du mir dein programm bitte zeile für zeile erklären?
ich weiß, ist viel arbeit, wäre aber echt nett^^
ich versteh nämlich von alldem nur etwa ein viertel^^
meine programme sind nicht fehlerhaft...sie entwickeln nur zufällig neue features
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hier mal mein "pretty_print":

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)
pd ist eine Liste von Listen, in denen die einzelnen Zahlen einer Reihe stehen.

So sollte das hübsch dynamisch klappen.

Die Werte des Dreiecks muss man natürlich vorher berechnen ;-)
gamemaster2422
User
Beiträge: 8
Registriert: Dienstag 5. Januar 2010, 19:34

ehm...da kommt garnichts^^
meine programme sind nicht fehlerhaft...sie entwickeln nur zufällig neue features
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

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.
gamemaster2422
User
Beiträge: 8
Registriert: Dienstag 5. Januar 2010, 19:34

cool...danke sehr
jez hab ichs verstanden
meine programme sind nicht fehlerhaft...sie entwickeln nur zufällig neue features
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wobei der "Trick" von hendrikS richtig gut ist :-) So spart man sich halt das Iterieren über der letzten Zeile...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Hyperion hat geschrieben:Hier mal mein "pretty_print":
Ich habe es so gelöst:

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))
self.dreieck enthält die Werte des Pascalschen Dreiecks als Liste von Listen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Patsch! Auf das max() hätte ich auch mal kommen sollen ^^

Code: Alles auswählen

    item_length = len(str(max(pd[-1])))
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Hyperion hat geschrieben:Patsch! Auf das max() hätte ich auch mal kommen sollen ^^
Da der größte Wert immer in der Mitte ist, dürfte man auch mit direkt reinindizieren bei len/2 Erfolg haben.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

hendrikS hat geschrieben:
Hyperion hat geschrieben:Patsch! Auf das max() hätte ich auch mal kommen sollen ^^
Da der größte Wert immer in der Mitte ist, dürfte man auch mit direkt reinindizieren bei len/2 Erfolg haben.
Ist aber mit max() eleganter finde ich.
BlackJack

Ich will auch noch mal:

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()
Antworten