Liste loopen und multiplizieren

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
Sally_CH
User
Beiträge: 2
Registriert: Montag 30. September 2019, 12:48

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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:

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):]))
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

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))
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

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.

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)))
Sally_CH
User
Beiträge: 2
Registriert: Montag 30. September 2019, 12:48

Herzlichen Dank für die vielen Ratschläge und Hinweise. Dank Eurer Hilfe konnte ich die Aufgabe lösen! ☺️👍🏻
Antworten