Python Liste ausgeben

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.
Antworten
Wormar
User
Beiträge: 2
Registriert: Mittwoch 22. Mai 2019, 15:25

Ich habe folgende aufgabe:

Implemtieren Sie in Aufgabe_1b.py einealternative Implementierung, die das Pascal'sche Dreieck in einem 1-dimensionalen Feld in der Form [1,1,1,1,2,1,1,3,3,1,. .. ] ablegt, ohne zuvor ein 2-dimensionales Feldzuerzeugen. Das Programm soll jedoch die gleiche dreiecksför-mige Ausgabe erzeugen wie das Programm aus Aufgabenteil(a).


die Aufgabe a hab ich gelöst und bei der b bin ich fast fertig. nur die ausgabe bereitet mit kopfschmerzen. ich verwende pycharm und muss die aufgabe für die uni machen. Folgengen Code habe ich bis jetzt:

Code: Alles auswählen

n = int(input('Geben sie eine natürliche Zahl ein: '))
Dreieck = []
for x in range (0,n+1):
    current = []
    if x == 0:
        current.append(1)

    else:
        for y in range(0,x+1):
            if y == 0 or y == x:
                current.append(1)
            else:
                elem = last[y-1]+last[y]
                current.append(elem)

    last = current
    for f in range(len(current)):
        Dreieck.append(current[f])

length = len(Dreieck)
start = 0
end = 1
line = 1
while length > -1:
    for i in range(start,end):
        print(Dreieck[i])
        length = length-1
    start = end
    end = end + line
    line = line + 1
Die liste wird zwar noch nicht als dreieck ausgegeben, aber darum geht es bei meiner frage auch nicht. viel mehr darum, dass ich bei der ausgabe immer folgenden error bekomme:

Code: Alles auswählen

Geben sie eine natürliche Zahl ein: 5
Traceback (most recent call last):
1
  File "Aufgabe_1b.py", line 26, in <module>
1
    print(Dreieck[i])
1
IndexError: list index out of range
1
2
1
1
3
3
1
1
4
6
4
1
1
5
10
10
5
1
Ich sitz hier und bin am grübeln und probieren und hab keinen schimmer, wie ich das lösen soll... kann mir einer helfen?
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

In Python händisch über einen Index zu iterieren, macht man nicht, weil es erstens kompliziert zu lesen und verstehen ist, zweitens umständlich zu schreiben und drittens leicht Fehler mit dem Index passieren können, so dass das Programm nicht läuft.
Deine Liste scheint zu kurz zu sein, oder end zu groß.

Variablen schreibt man in Python klein_mit_unterstrich, also `dreieck`. Bei `x` und `y` würde ich Fließkommazahlen erwarten, keine ganzen Zahlen.

Als Aufgabensteller würde ich für Teil 1b Punkte abziehen, weil schon allein das erzeugen von einer neuen Liste `current` quasi das Dreieck zweidimensional aufbaut.
Die Zeilen:

Code: Alles auswählen

for f in range(len(current)):
        Dreieck.append(current[f])
sind einfach

Code: Alles auswählen

Dreieck.extend(current)
Wormar
User
Beiträge: 2
Registriert: Mittwoch 22. Mai 2019, 15:25

Erstmal danke für die Antwort. Bislang haben wir noch nichts Anderes gelernt, als über den Index zu iterieren, daher weiß ich auch nicht, wie es anders geht. Das mit den Variablen werde ich mir merken.
Warum Fließkommazahlen bei 'x' und 'y'?
Dann muss ich die Listenerzäugung nochmal überarbeiten. (Mir ist jedoch noch nicht ganz klar, wie ich das anstellen werde, da sich das Programm ja merken muss, welche Zahlen in der vorherigen Zeile sind, da die Zahlen in der neuen Zeile darauf aufbauen (sind die Summen der Zahlen der Vorherigen).

Zu der Ausgabe habe ich mittlerweile die Lösung des Problems gefunden.

Code: Alles auswählen

length = len(Dreieck)
start = 0
end = 1
line = 1
while length > 0:
    for i in range(start,end):
        print(Dreieck[i])
        length = length - 1
    start = end
    line = line + 1                  				#diese zeile musste
    end = end + line 						#mit dieser Zeile vertauscht werden
Benutzeravatar
__blackjack__
User
Beiträge: 13075
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Wormar: Die Erwartung bei `x` und `y` kommt aus der Mathematik. Ganze Zahlen/Indexwerte werden da, und dementsprechend auch in den meisten Programmiersprachen `i`, `j`, und `k` genannt. Wenn man mehr als drei braucht, dann verschachteln man in der Regel Schleifen zu tief und/oder man will bessere, beschreibendere Namen als einzelne Buchstaben verwenden.

Wenn das iterieren per Laufindex das einzige ist was ihr in dem Zusammenhang gelernt habt, dann lernt ihr da kein Python. Denn das einfachste, und deswegen auch das was man in Python macht, ist direkt über die Elemente zu iterieren, ohne den unnötigen Umweg über einen Index.

Aber insbesondere diese zweite Aufgabe soll wohl absichtlich umständlich und fehleranfällig mit Indexen operieren, damit ihr lernt wie man es *nicht* macht. :-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich verbinde mit x und y Kommazahlen, weil das Konvention ist. Deshalb verwirrt es ja, dass das keine sind.

Hier mal eine Variante, wie man Python nutzen kann, um nie mit Indizes in Berührung zu kommen:

Code: Alles auswählen

dreieck = [1]
previous = iter(dreieck)
num = 0
for _ in range(n*(n-1)//2 + 1):
    if num == 1:
        dreieck.append(1)
        _ = next(previous)
    last_num, num = num, next(previous)
    dreieck.append(last_num + num)
    if num == 1:
        dreieck.append(1)

ones = 0
for num in dreieck:
    ones += num == 1
    print(num, end='\n' if ones % 2 else ' ')
Antworten