Hallo zusammen,
ich besuche einen Programmierkurs mit Python 3 dieses Semester an der Uni und hatte vorher noch nichts mit Programmieren zu tun.
Nach tagelangem Recherchieren zum Lösen meiner Aufgaben, bin ich nur wenig bis gar nicht weiter gekommen und bin daher auf Eure Hilfe angewiesen.
In der Aufgabe geht es darum, eine gegebene Liste zu loopen, die ab dem Wert "3" für i beginnen soll, die darauf folgenden Werte zu multiplizieren und das Endresultat zu printen.
Im Teil A der Aufgabe war die Liste sehr kurz, und ich bin mit folgendem Code auf die richtige Lösung gekommen, jedoch funktionierte es bei der Liste im Teil B nicht mehr, daher muss wohl doch ein Fehler vorliegen.
Für Eure Unterstützung danke ich im Voraus!
LG Sally
Teil A)
list1 = [5, 3, 3, 2]
for i in list1:
if i == 3:
i=saved
if result!=0:
result=result*i
print(result) #result war 18
Teil B)
list2= [5, 7, 2, 9, 8, 9, 3, 4, 2, 3, 2, 7, 7, 5] #result sollte 35280 sein
Liste loopen und multiplizieren
Leider kann man die Einrueckungen in deinem Code nicht sehen. Dazu bitte in Zukunft die Code-Tags verwenden (der </>-Knopf im Editor). Ich kann mir aber nicht vorstellen, dass der Code funktioniert hat, denn du beziehst dich auf "saved" - und das gibt es nicht. Damit wuerde das Progamm abstuerzen.
Ein paar Hinweise zur Loesung: es ist beim Programmieren oft nuetzlich ein Problem in Teilprobleme zu zerlegen. In deinem Fall ist eines davon eine gegebene Liste elementweise zu multiplizieren. Das solltest du einfach als Funktion schreiben, die eine Liste bekommt und das Produkt aller ihrer Elemente zurueckliefert.
Und das zweite Problem besteht darin, aus einer gegebenen Liste eine neue zu bauen, die alle Elemente am Anfang die nicht 3 sind ignoriert, und die Restliste (3en inklusive!) zurueckliefert. Auch das kannst du erstmal als eigenstaendige Funktion schreiben.
Aus der Kombination dieser beiden Funktionen ergibt sich dann die Loesung.
Ein paar Hinweise zur Loesung: es ist beim Programmieren oft nuetzlich ein Problem in Teilprobleme zu zerlegen. In deinem Fall ist eines davon eine gegebene Liste elementweise zu multiplizieren. Das solltest du einfach als Funktion schreiben, die eine Liste bekommt und das Produkt aller ihrer Elemente zurueckliefert.
Und das zweite Problem besteht darin, aus einer gegebenen Liste eine neue zu bauen, die alle Elemente am Anfang die nicht 3 sind ignoriert, und die Restliste (3en inklusive!) zurueckliefert. Auch das kannst du erstmal als eigenstaendige Funktion schreiben.
Aus der Kombination dieser beiden Funktionen ergibt sich dann die Loesung.
Einrückungen sind in Python wichtig, und sollten immer vier Leerzeichen pro Ebene sein, nicht mal 6 und mal 5 oder 3. Diese Sorgfalt ist auch wichtig, weil man bei allem, was man Programmiert sehr sorgfältig sein muß. Ein Computer verzeiht keine Fehler.
Dein Code läuft nicht, weil result nie definiert wurde, also das Programm mit einem NameError aussteigt. Wenn Du hier Code postest, kopiere Deinen Originalcode hier ins Forum und nicht irgendwas, das so ähnlich aussieht.
Den sauberen Weg hat __deets__ ja schon beschrieben. Der andere Weg wäre, so wie Du schon gestartet hast, `result` als Flag zu benutzen, ob schon eine 3 in der Liste aufgetaucht war. Dann solltest Du aber noch berücksichtigen, dass bei weiteren 3en das Ergebnis nicht kaputt geht.
Dein Code läuft nicht, weil result nie definiert wurde, also das Programm mit einem NameError aussteigt. Wenn Du hier Code postest, kopiere Deinen Originalcode hier ins Forum und nicht irgendwas, das so ähnlich aussieht.
Den sauberen Weg hat __deets__ ja schon beschrieben. Der andere Weg wäre, so wie Du schon gestartet hast, `result` als Flag zu benutzen, ob schon eine 3 in der Liste aufgetaucht war. Dann solltest Du aber noch berücksichtigen, dass bei weiteren 3en das Ergebnis nicht kaputt geht.
Es scheint mir ja sinnvoller vor der Schleife zu ermitteln, an welcher Position die erste 3 auftaucht. Dann braucht man nur noch über den Rest laufen.
Funktional sähe das so aus:
Funktional sähe das so aus:
Code: Alles auswählen
import functools
import operator
data = [5, 7, 2, 9, 8, 9, 3, 4, 2, 3, 2, 7, 7, 5]
print(functools.reduce(operator.mul, data[data.index(3):]))
So würde ich das umsetzen (mit Flag):
Code: Alles auswählen
import numpy
data = [5, 7, 2, 9, 8, 9, 3, 4, 2, 3, 2, 7, 7, 5]
numbers_to_multiply = []
flag = False
for number in data:
if number == 3:
flag = True
if flag:
numbers_to_multiply.append(number)
print(numpy.prod(numbers_to_multiply))
Ich bin gerade verwirrt. Wer hat hier Hausaufgaben bekommen?
@/me: das setzt halt voraus, dass man eine Liste hat.
Ohne explizite Schleife geht das auch mit itertools.dropwhile.
@/me: das setzt halt voraus, dass man eine Liste hat.
Ohne explizite Schleife geht das auch mit itertools.dropwhile.
Code: Alles auswählen
import operator
from itertools import dropwhile
from functools import reduce
data = [5, 7, 2, 9, 8, 9, 3, 4, 2, 3, 2, 7, 7, 5]
print(reduce(operator.mul, dropwhile(lambda x: x != 3, data)))