Seite 1 von 1

Summieren von Elementen einer Liste macht Probleme

Verfasst: Freitag 6. Juni 2008, 13:15
von timo_81
Hi Leute,

ich möchte gerne Werte die ich aus einer Datei lese,
in eine Liste schreiben und diese dann summieren.
Hier ist mein Ansatz:

Code: Alles auswählen

def berechnen():#In diesen Listen sind die jeweiligen Gesamtpreise gespeichert
        global ergebnis_liste
        ergebnis_liste=[]
        
        datei_gesamt = open("/Users/user/Desktop/Kunden/emp.tmp", 'r') 
        for line_gesamt in datei_gesamt.readlines():
            
            ergebnis_liste.append(line_gesamt.strip())
            datei_gesamt.close()
       
    
    
        print sum((ergebnis_liste))        #Hier gibt es noch ein Fehler

Die Liste sieht wie folgt aus:

['59.50', '67.50', '27.00', '47.60', '752.40']

leider gibt es ein Typenproblem bei Aufruf von sum()

Gibt es irgendwelche Ideen?

Grüße
Tim

Verfasst: Freitag 6. Juni 2008, 13:29
von Karl
Ich denke mal der Typfehler könnte daran liegen, dass es Strings sind die in der Liste gespeichert sind?
Aber die genaue Fehlermeldung ist auch immer gut. Auch wenn Leute wie Blackjack das Problem auch so direkt erkennen, ich hab's aber leichter mit einer Fehlermeldung :p
Außerdem schonmal drüber nachgedacht, return zu benutzen, anstatt global?
Edit: Außerdem sollte man print in einer Funktion vermeiden, wenn man den Wert auch einfach zurückgeben (returnen) kann, und anschließend ausgeben kann.

Verfasst: Freitag 6. Juni 2008, 13:36
von BlackVivi

Code: Alles auswählen

from __future__ import with_statement

def get_customervalue(fl_path):
    results = []
    with file(fl_path, "r") as fl:
        for val in fl.readlines():
            result.append(float(val.strip())
    return sum(results)
Also: Du hast Strings in'r Liste und du kannst nicht Strings so summieren wie sum es macht. Also vorher in float umwandeln, da es Fließkommazahlen sind. Ich habe die Funktion hier geschrieben um dir'n Ansporn zu geben, was neues zu lernen... Wenn du das alles verstehst, weißt du auch was bei dir falsch lief!

Verfasst: Freitag 6. Juni 2008, 13:55
von timo_81
Danke sehr,

ja ich denke ich habe es verstanden einfach bevor die Werte in die Liste kommen, diese in float umwandeln

Verfasst: Freitag 6. Juni 2008, 13:56
von timo_81
hey,
aber es wird sttt 957.00 nun nur 957.0 ausgegeben.
Irgendeine Möglichkeit die zweite Nachkommastelle zu "retten"

Verfasst: Freitag 6. Juni 2008, 14:15
von Leonidas
timo_81 hat geschrieben:aber es wird sttt 957.00 nun nur 957.0 ausgegeben.
Irgendeine Möglichkeit die zweite Nachkommastelle zu "retten"
Natürlich, denn es ist ja nur eine Darstellungssache: ``"%.2f" % 957.0``. Da muss man nichts retten denn es werden ja Zahlen gespeichert. 957, 957.0, 957.00 sind ja nur Repräsentationen dieser Zahlen.

Verfasst: Freitag 6. Juni 2008, 15:25
von audax

Code: Alles auswählen

from __future__ import with_statement

def get_customervalue(filepath):
    with open(filepath, "r") as input:
        return sum(map(float, input))
das `strippen` macht float() automatisch :]

Verfasst: Freitag 6. Juni 2008, 17:20
von Darii
timo_81 hat geschrieben:hey,
aber es wird sttt 957.00 nun nur 957.0 ausgegeben.
Irgendeine Möglichkeit die zweite Nachkommastelle zu "retten"
Schau dir mal decimal.Decimal an.

Verfasst: Freitag 6. Juni 2008, 17:47
von EyDu
Darii hat geschrieben:
timo_81 hat geschrieben:hey,
aber es wird sttt 957.00 nun nur 957.0 ausgegeben.
Irgendeine Möglichkeit die zweite Nachkommastelle zu "retten"
Schau dir mal decimal.Decimal an.
Wie Leonidas schon gesagt hat ist das keine Ungenauigkeit, sondern nur die Darstellung.

Verfasst: Freitag 6. Juni 2008, 20:26
von timo_81
Vieln Dank , habe mit eurer Hilfe das Problem gelöst!!
Danke nochmals
Gruß
Timo

Verfasst: Samstag 7. Juni 2008, 09:01
von Darii
EyDu hat geschrieben:
Darii hat geschrieben:
timo_81 hat geschrieben:hey,
aber es wird sttt 957.00 nun nur 957.0 ausgegeben.
Irgendeine Möglichkeit die zweite Nachkommastelle zu "retten"
Schau dir mal decimal.Decimal an.
Wie Leonidas schon gesagt hat ist das keine Ungenauigkeit, sondern nur die Darstellung.
Ja, aber nur weil die Zahl zufällig exakt als Binärzahl darstellbar ist.

Verfasst: Samstag 7. Juni 2008, 09:33
von BlackJack
Es geht hier um's aufsummieren und zwei dezimale Nachkommastellen. Da muss man schon *sehr* viele Werte aufsummieren, die sich nicht exakt als binäre Fliesskommazahl darstellen lassen, bis sich das in der zweiten Dezimalstelle nach dem Komma bemerkbar macht.

Verfasst: Samstag 7. Juni 2008, 10:17
von Darii
Ja ich weiß(zumal ein Python float ja ein double ist), ich wollte es dem Fragesteller auch nur als Möglichkeit vorschlagen, da es ja hier offenbar nicht nur um irgendwelche Zahlen, sondern Geldbeträge geht.

Verfasst: Montag 9. Juni 2008, 09:35
von Hyperion
Darii hat geschrieben:Ja ich weiß(zumal ein Python float ja ein double ist), ich wollte es dem Fragesteller auch nur als Möglichkeit vorschlagen, da es ja hier offenbar nicht nur um irgendwelche Zahlen, sondern Geldbeträge geht.
Hier fehlt uns Gerold, der uns als anerkannter Kassensystemexperte sicherlich unterstützen würde ;-) Sicherlich haben beide Seite irgend wie recht, aber bei Geldbeträgen würde ich auch immer auf einen Typen zurückgreifen, der dafür gemacht wurde. Kommen dann noch Datenbanken ins Spiel gerät man sonst schnell in die Bredouille!