Forum: PC-Programmierung Liste zusammenrechnen in PYthon


von Peter (Gast)


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

von mar IO (Gast)


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.

von mar IO (Gast)


Lesenswert?

[c]
print (list_of_numbers)
[\c]

Jetzt sehe ich gerade, da wird es auch noch ein Problem geben. Möchtest 
Du Zahlen verrechnen oder Strings verknüpfen.

von Robot (Gast)


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.

von pyFan (Gast)


Lesenswert?

enthält diebliste zufällig europreise von ebay shops? :p

von Tom (Gast)


Angehängte Dateien:

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.

von Robot (Gast)


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.

von Peter (Gast)


Lesenswert?

Danke für die Antworten,

Aber leider bekomme ich das nicht hin.

Ich werde mir das morgen nochmal ganz in Ruhe ansehen

von Robot (Gast)


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.

von eric (Gast)


Lesenswert?

Und das Rad muss man auch nicht jedes mal neu erfinden, Python hat sum() 
schon eingebaut:
1
>>> print(sum([1,2,3,4,5,6,7,8,9]))
2
45

von Lukas K. (carrotindustries)


Lesenswert?

Geht mit generator comprehension als schlanker Einzeiler:
1
>>> list_of_numbers=['29,90', '35,90', '59,90', '44,90', '69,90', '19,90', '69,90', '44,90']
2
>>> sum(float(x.replace(",", ".")) for x in list_of_numbers)
3
375.19999999999993

von Robot (Gast)


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.

von root (Gast)


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

von root (Gast)


Lesenswert?

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))

das ist übrigens ganz Un-Pythonig :)

von Königspython Köbeli (Gast)


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...

von Königspython Köbeli (Gast)


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.

von Sven B. (scummos)


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.

: Bearbeitet durch User
von root (Gast)


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 :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.