Summieren von Elementen einer Liste macht Probleme

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
timo_81
User
Beiträge: 23
Registriert: Dienstag 11. März 2008, 18:08

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
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

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.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

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!
timo_81
User
Beiträge: 23
Registriert: Dienstag 11. März 2008, 18:08

Danke sehr,

ja ich denke ich habe es verstanden einfach bevor die Werte in die Liste kommen, diese in float umwandeln
timo_81
User
Beiträge: 23
Registriert: Dienstag 11. März 2008, 18:08

hey,
aber es wird sttt 957.00 nun nur 957.0 ausgegeben.
Irgendeine Möglichkeit die zweite Nachkommastelle zu "retten"
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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 :]
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
timo_81
User
Beiträge: 23
Registriert: Dienstag 11. März 2008, 18:08

Vieln Dank , habe mit eurer Hilfe das Problem gelöst!!
Danke nochmals
Gruß
Timo
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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!
Antworten