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
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#Konvertierunghttp://www.python-kurs.eu/python3_kurs.php
Grüße,
R.
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:
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:
@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.
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
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 :)
> 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...
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.
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.
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 :)