Liste zusammenrechnen in PYthon

Gast #4467089
Lesenswert?

Hallo,

ich versuche gerade aus einer externen Liste alle zahlen 
zusammenzurechnen.
1
print (list_of_numbers)
2

3
def sum(Zahlen):
4
    total = 0
5
    for i in Zahlen:
6
        total += i    
7
    return total         
8
 
9
n = [(list_of_numbers)]        
10
print (sum(n))

Das erste print sagt mir das hier:
1
['29,90', '35,90', '59,90', '44,90', '69,90', '19,90', '69,90', '44,90']


Und meine Fehlermeldung sagt mir:
1
Traceback (most recent call last):
2
  File "D:\Python erste Versuche\Main3.py", line 21, in <module>
3
    print (sum(n))
4
  File "D:\Python erste Versuche\Main3.py", line 17, in sum
5
    total += i    
6
TypeError: unsupported operand type(s) for +=: 'int' and 'list'


Ich habe jetzt den ganzen Vormittag bereits gegoogelt, aber ich bekomme 
es nicht hin...

Wie bekomme ich das zusammengerechnet?


P.S.: Ich bin Anfänger, habt etwas Nachsicht bei diversen Fehlern
Gast #4467108
Lesenswert?

1
n = [(list_of_numbers)]

Erzähl mal was Du hier machst.

Und dann versuch mal diese Fehlermeldung zu interpretieren.
1
TypeError: unsupported operand type(s) for +=: 'int' and 'list'

Wenn ich mich nicht verschaut habe, dann ist das dein Problem.
Gast #4467123
Lesenswert?

Hallo Peter,

ich ich sehe folgende Probleme:

Peter schrieb:

> print (list_of_numbers)
>
> def sum(Zahlen):
>     total = 0
>     for i in Zahlen:
>         total += i
>     return total
>
> n = [(list_of_numbers)]
> print (sum(n))

Warum übergibst Du nicht gleich list_of_numbers, Du machst aus einer 
Liste eine Liste - unnötiger Aufwand. (=> aber nicht falsch!)
>
>
> Das erste print sagt mir das hier:['29,90', '35,90', '59,90', '44,90',
> '69,90', '19,90', '69,90', '44,90']

Hier dürfte das Problem liegen. Du hast die Liste ausgegeben und erhälst 
Strings, also Zeichenketten. Wären es Zahlen sollte es so aussehen
[ 29.90, 35.90, ... ]
ich bin mir nicht sicher, aber ich denke es gibt keine eingebaute 
Listenfunktion um Zahlen zu addieren. Also ist der Ansatz mit der 
eigenen Routine schon korrekt.

Man muss nur noch die Strimgs in Zahlen konvertieren ...
>     for i in Zahlen:
>         total += float(i)
>     return total

Dann könnte es gehen.

Schau auch mal hier, wenn Du es nicht schon selbst gefunden hast.

https://de.wikibooks.org/wiki/Benutzer:Schmidt2/Druckversion_Python_unter_Linux#Konvertierung

http://www.python-kurs.eu/python3_kurs.php

Grüße,

R.
Gast #4467131
Lesenswert?

An allen Stellen reichlich Debugausgaben spendieren. Dann sieht man die 
Datentypen und warum etwas schiefgeht.
1
Liste: ['29,90', '35,90', '59,90', '44,90', '69,90', '19,90', '69,90', '44,90']
Das ist OK.
1
n= [['29,90', '35,90', '59,90', '44,90', '69,90', '19,90', '69,90', '44,90']]
Hier gibt es ein Problem.  Wie werden Listen in Python angelegt und wie 
dargestellt. Was ist n genau?
1
sum() beginnt
2
i= ['29,90', '35,90', '59,90', '44,90', '69,90', '19,90', '69,90', '44,90']
Huh? Das ist nicht richtig, und die Lösung liegt in n im letzten 
Punkt.
Angehängte Dateien:
Gast #4467176
Lesenswert?

Ich greife das von Tom mal auf. Er schreibt ganz korrekt das Du aus 
einer Liste eine neue Liste erzeugst, dabei aber eben Deine Liste 
list_of_numbers nur als erstes Element der neuen Liste einfügst. Beim 
Aufruf der Funktion sum(n) erhälst Du für Dein i dann auch nur wieder 
deine alte Liste list_of_numbers als Ergebnis.

Versuche es mal so:
1
print (list_of_numbers)
2

3
def sum(Zahlen):
4
    total = 0
5
    for i in Zahlen:
6
        total += float(i)
7
    return total         
8
 
9
print (sum(list_of_numbers))

Gruß,

R.
Gast #4467370
Lesenswert?

Hallo Peter,

Dein Problem sind wahrscheinlich die Kommata in der Liste. Also die 
Strings enthalten ',' statt '.'. Das kann man auf verschiene Arten 
ersetzen, da wir mit Strings arbeiten bietet sich die Funktion 
strin.replace(",",".") an.

Im Programm sieht das dann so aus:
1
list_of_numbers=['29,90', '35,90', '59,90', '44,90', '69,90', '19,90', '69,90', '44,90']
2

3

4
print (list_of_numbers)
5

6
def sum(Zahlen):
7
    total = 0
8
    for i in Zahlen:
9
        print(i)
10
        i = i.replace(",",".")
11
        print(i)
12
        total += float(i)
13
    return total
14

15
print (sum(list_of_numbers))

Die Print-Statements habe ich mal drin gelassen damit man sieht was 
passiert.

Schönen Sonntag noch,

R.
Gast #4467511
Lesenswert?

@eric

... schön, da ich meist mit numpy arbeite wusste ich das bei Listen 
nicht,
aber da es sich hier nicht um eine Liste mit Zahlen sondern mit Strings
handelt müßte man es machen wie ...

@Lukas.K

Sehr elegant ... in C gibt es auch Einzeiler die wunderschön sind,
leider gibts nur wenige die es lesen und verstehen können und dem
Compiler ist es heute auch egal.

Hier ist glaube ich der Lerneffekt wichtiger, elegant kommt später. ;-)

Wenn man größere Arrays nutzen will sollte man dann vielleicht direkt 
mit numpy.array zu arbeiten.

Gruß,

R.
Gast #4468799
Lesenswert?

python hat schon sum Funktion
sum(map(lambda x: float(str.replace(x,",",".")),list_of_numbers))
375.19999999999993

oder halt so (mit funktionalem Ansatz, foldr/foldl)
reduce(lambda x,y: x+y, map(lambda x: 
float(str.replace(x,",",".")),list_of_numbers))
375.19999999999993
Gast #4469382
Lesenswert?

> das ist übrigens ganz Un-Pythonig :)

Genau, der pytHONIG nennt sich "syntactic sugar" und hier haben wir ein 
Paradebeispiel davon: wenn man genug (Python) programmiert hat und 
analytisch zurückblickt, ist festzustellen dass das Codemuster 
"map(...lambda...list)" eben häufig vorkommt.
Also wurde die äquivalente Abkürzung (die syntaktische Versüssung - 
syntactic sugar) die sog list comprehension in die Sprache eingebaut.

Ja, sie zu lernen ist ein wenig Aufwand.
Hat man es mal intus, will man nie wieder davon weg :)

Wir sprechen ja auch kein sperriges Althochdeutsch mehr...
Gast #4469389
Lesenswert?

das vollständige Codemuster ist übrigens:

  map(lambda... filter... list)

Also:
  Von der Liste, wird auf jene Elemente welche dem Filterkriterium 
entsprechen, die (anonyme lambda-)Bearbeitungsfunktion angewendet.

  Es entsteht eine neue Liste welche die (wie auch immer) 
bearbeiteten/gefilterten Elemente entält.
#4469513
Lesenswert?

1
import numpy as np
2
l = np.fromstring(s.replace(',', '.'))
3
s = np.sum(l)

map würde ich auch vermeiden, die list comprehensions sind meist 
lesbarer und die map objects tun oft nicht das was du erwartest.

Und fix' mal die Quelle der Zahlen dass die die nicht mit Kommas als 
Trennzeichen ausgibt.
Gast #4469581
Lesenswert?

ich finde list comprehensions im Kontext vorteilhaft,
wenn die Elemente vorher gefiltert werden, bevor auf sie
eine Funktion angewandt wird. Das ersetzt
map(lambda x: .., filter(lambda x: ...), lst)

oder aber im solchen Kontext

ij = [(i,j) for i in range(10) for j in range(10) if i*j<50]

oder wenn Generator erforderlich ist

ij = ((i,j) for i in range(10) for j in range(10) if i*j<50)

in anderen Fällen mag ich auch einfaches map :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren