Problem mit append Funktion

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
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

Hallo,
ich wäre euch sehr dankbar, wenn ihr mir helfen könntet:
das ist tatsächlich keine "Hausaufgabe", sondern ein Problem bei dem ich nicht weiterkomme und ich verstehen will, was ich falsch mache, es geht um die append Funktion, folgender Code:

Code: Alles auswählen

 Mengenliste = [50, 50, 50, 200, 100, 50, 50, 50, 50, 50, 50, 50, 21.0, 1.5, 100]
Verbrauchliste = [1, 1, 1, 4, 2, 1, 1, 1, 1, 1, 1, 1, 0.42, 0.03, 2]
Mengen = []
time = []
for t in range(16):
    if (t/8).is_integer() is True:
        i= 0
        time.append(t)
        for element in Mengenliste:
            nelement = round(element-Verbrauchliste[i],2)
            Mengenliste[i] = nelement
            i = i+1
        Mengen.append(Mengenliste)
        print(Mengenliste)
print(Mengen)   
Nun gibt er mir als Output am Ende eine Liste mit mehreren Listen, wo die Listen alle 0 sind. Nach meiner Vorstellung sollte das Programm allerdings, eine Liste ausgeben wo alle Results der Mengenliste drinne vorkommen.

Was mache ich falsch?

Ich danke :)
Sirius3
User
Beiträge: 18258
Registriert: Sonntag 21. Oktober 2012, 17:20

Um zu wissen, was falsch ist, müssten wir auch wissen, was Dein eigentliches Ziel ist. Für mich ist das erstmal nur wirrer Code. Was soll `time` hier? Die Zeit spielt doch für die Rechnung in der inneren Schleife gar keine Rolle.
Du weißt, dass append nur einen Verweis auf die ursprüngliche Liste speichert? Alle Listen in `Mengen` sind die eine identische Liste.

Daher ändert man in Python keine Listen, sondern erzeugt sich neu.

Code: Alles auswählen

def reduziere_verbrauch(mengen, verbraeuche):
    neue_mengen = []
    for menge, verbrauch in zip(mengen, verbraeuche):
        neue_mengen.append(round(menge-verbrauch, 2))
    return neue_mengen

mengen = [50, 50, 50, 200, 100, 50, 50, 50, 50, 50, 50, 50, 21.0, 1.5, 100]
verbraeuche = [1, 1, 1, 4, 2, 1, 1, 1, 1, 1, 1, 1, 0.42, 0.03, 2]
zeitlicher_verlauf = []
for t in range(0, 16, 8):
    neue_mengen = reduziere_verbrauch(mengen, verbraeuche)
    print(neue_mengen)
    zeitlicher_verlauf.append(neue_mengen)
    mengen = neue_mengen
print(zeitlicher_verlauf)
Kürzer:

Code: Alles auswählen

def reduziere_verbrauch(mengen, verbraeuche):
    return [round(menge-verbrauch, 2) for menge, verbrauch in zip(mengen, verbraeuche)]
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

Hallo,
und vielen dank für die Antwort :)
ja entschuldige, ich habe vor mit der Liste einen Zeitdiagramm für einen Produktionsablauf zu erstellen, wo ich den Materialverbrauch simuliere, deshalb time, da ich aus den beiden Listen später vorhabe ein Diagram mit matplotlib zu erstellen.
Die Zeit kann je nach dem variieren, abhängig von der Menge die wir gerade produzieren wollen.
Benutzeravatar
__blackjack__
User
Beiträge: 14016
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich würde empfehlen statt Gleitkommazahlen und `round()` lieber ganze Zahlen zu verwenden oder `decimal.Decimal`. Sonst geht das am Ende nicht wirklich auf wenn Du Dezimalbrüche hast die sich nicht exakt als `float` darstellen lassen. 0.03 beispielsweise kann als `float` nicht exakt repräsentiert werden. Und wenn man wiederholt addiert/subtrahiert dann ist da bei jedem Schritt auch eine Ungenauigkeit drin die sich aufsummiert und die man auch mit `round()` nicht weg bekommt wenn dabei wieder etwas heraus kommt das sich nicht exakt darstellen lässt.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten