Seite 1 von 1
Liste Summen von bestimmten Feldern
Verfasst: Dienstag 31. März 2020, 14:20
von ossi047
Ich komm und komm nicht weiter. Habe schon x-Handbücher durchgelesen aber noch nichts gefunden.
Bitte um eine kleine Hilfe.
Ich habe eine Liste [2.0, "DN20", 4.5, "DN25", 2.4, "DN20", 0.00, "DN40", 7.8, "DN25"]
Ich möchte alle werte (DN20 und DN25) mit z.B.: DN20 also 2.0 und 4.5 summieren und den wert speichern.
Die werte (z.B.: DN20) können an verschiedenen Stellen stehen einmal auf Index 1, dann auf Index 3 usw.
Links von DN seht immer die Menge.
Danke für eure Mühe.
Re: Liste Summen von bestimmten Feldern
Verfasst: Dienstag 31. März 2020, 14:39
von Sirius3
Woher kommt denn die Liste? Das Format ist nicht gerade ideal, um damit weiter zu arbeiten. Wenn es geht, solltest Du das schon beim Erzeugen der Liste in Tupeln zusammenfassen:
Code: Alles auswählen
[(2.0, "DN20"), (4.5, "DN25"), (2.4, "DN20"), (0.0, "DN40"), (7.8, "DN25")]
Dann ist es auch kein Problem, mit einer for-Schleife zu arbeiten.
Die Regeln für das Zusammenfassen habe ich aber noch nicht verstanden. Kannst Du das nochmal exakt eklären, so dass das auch ein Computer versteht, am besten mit dem Beispiel was als Ergebnis rauskommen soll.
Re: Liste Summen von bestimmten Feldern
Verfasst: Dienstag 31. März 2020, 14:42
von noisefloor
Hallo,
du iterierst über die Liste, bestimmst die Indexe deines Suchbegriffs, rufst dann alle Werte "links" davon (=Index-1) ab und summierst die auf.
Das kann man übrigens auch als 1-Zeiler als List Comprehension schreiben
Wenn du nicht weiter kommst: zeig' mal deinen Code, der das Erreichen soll, dann kann man konkreter Helfen.
Gruß, noisefloor
Re: Liste Summen von bestimmten Feldern
Verfasst: Dienstag 31. März 2020, 14:44
von Sirius3
@noisefloor: mit einem Index sollte man erst gar nicht anfangen. Das gibt keinen schönen Python-Code.
Re: Liste Summen von bestimmten Feldern
Verfasst: Dienstag 31. März 2020, 14:44
von pillmuncher
Was Sirius3 gesagt hat: erzeuge von Anfang an Daten in der richtigen Struktur, dann musst du hinterher nicht rumbasteln.
Apropos rumbasteln:
Code: Alles auswählen
>>> values = data[::2]
>>> values
[2.0, 4.5, 2.4, 0.0, 7.8]
>>> keys = data[1::2]
>>> keys
['DN20', 'DN25', 'DN20', 'DN40', 'DN25']
>>> from collections import defaultdict
>>> sums = defaultdict(float)
>>> for k, v in zip(keys, values):
... sums[k] += v
...
>>> dict(sums)
{'DN20': 4.4, 'DN25': 12.3, 'DN40': 0.0}
Re: Liste Summen von bestimmten Feldern
Verfasst: Dienstag 31. März 2020, 15:02
von einfachTobi
Falls du irgendwie Einfluss auf die Erzeugung der Liste hast, solltest du die Werte bereits als Tuple zusammenfassen (1. Beitrag von Sirius3). Das erspart dir umständliches umsortieren.
@pillmuncher: Da mache ich doch glatt mit:
Code: Alles auswählen
from itertools import groupby
liste = [2.0, "DN20", 4.5, "DN25", 2.4, "DN20", 0.00, "DN40", 7.8, "DN25"]
gruppen = [(key, sum([n for _, n in group])) for key, group in groupby(sorted(list(zip(liste[1::2], liste[0::2]))), lambda x: x[0])]
print(gruppen)
Code: Alles auswählen
import pandas as pd
liste = [2.0, "DN20", 4.5, "DN25", 2.4, "DN20", 0.00, "DN40", 7.8, "DN25"]
df = pd.DataFrame(sorted(list(zip(liste[1::2], liste[0::2]))), columns=["DN", "Nummer"]).groupby("DN").sum()
print(df)
Re: Liste Summen von bestimmten Feldern
Verfasst: Dienstag 31. März 2020, 15:53
von ossi047
Hallo liebe Spezialisten.
Jetzt habe ich mehrere Vorschläge bekommen mit Pandas, intertools und sonst noch was aber leider noch keine Lösung. Ich kann das Format der Liste oder Tupel noch aussuchen. Schön wäre natürlich ein Vorschlag (Liste oder Tupel) wie dieser aussehen soll damit die gleichen zB.: DN20 (Werte davon links von DN20) da einfach summieren kann.
Danke nochmals für die Antworten.
Re: Liste Summen von bestimmten Feldern
Verfasst: Dienstag 31. März 2020, 16:09
von einfachTobi
Du hast 1. einen Vorschlag zur Formatierung der Daten bekommen. Darauf wurde mehrfach Bezug genommen.
2. funktionieren alle gezeigten Lösungsvorschläge. Wo ist also dein Problem?
Re: Liste Summen von bestimmten Feldern
Verfasst: Dienstag 31. März 2020, 17:03
von ossi047
Danke für die Infos. Leider kenne ich weder mit intertools und pandas aus. Meine Frage habe ich eben aus diesem Grund gestellt, weil ich eben nicht weiter weis. Ihr seid sicher bemüht da immer Antworten zu liefern. Aber leider wenn ich viele Antworten da im Forum lese sind diese sehr überheblich formatiert. Alleine die Frage "Wo ist also dein Problem" ist schon ein Beispiel dafür. Ich erwarte mir daher auch keine Antworten mehr von euch.
Re: Liste Summen von bestimmten Feldern
Verfasst: Dienstag 31. März 2020, 17:05
von noisefloor
Hallo,
du hast die Frage nach dem "was" aber noch nicht definitiv beantwortet. So wie du schreibst willst du die Werte von z.B. DN20 addieren. Im Eingangspost addierst du aber die Werte von ersten DN20 und dem darauf folgenden DN25. Ist das ein Tippfehler? Das ist halt für den Lösungsansatz wichtig.
Für ersteres (also z.B. alle DN20 summieren) hast du doch drei fertige Lösungen und einen Vorschlag für eine bessere Datenstruktur.
Gruß, noisefloor
Re: Liste Summen von bestimmten Feldern
Verfasst: Dienstag 31. März 2020, 18:10
von einfachTobi
@ossi047: Das ist nicht überheblich, sondern eine einfach Frage. Wie sollte ich denn sonst nach deinem, offensichtlich immer noch vorhandenen, Problem fragen? Was verstehst du nicht? Was funktioniert nicht? Wo gibts einen Fehler? Was für ein Verhalten des Programmes erwartest du und welches Verhalten tritt stattdessen auf?
Wenn du die nötige Frage zur Lösung deines Problems als Überheblichkeit empfindest, kann ich dir auch nicht helfen.
Re: Liste Summen von bestimmten Feldern
Verfasst: Mittwoch 1. April 2020, 04:30
von snafu
ossi047 hat geschrieben: Dienstag 31. März 2020, 14:20
Ich möchte alle werte (DN20 und DN25) mit z.B.: DN20 also 2.0 und 4.5 summieren und den wert speichern.
Da anscheinend eine Komplettlösung gewünscht ist:
Code: Alles auswählen
items = [2.0, "DN20", 4.5, "DN25", 2.4, "DN20", 0.00, "DN40", 7.8, "DN25"]
result = sum(v for v, k in zip(*[iter(items)] * 2) if k == "DN20")
print(result)
Und nun viel Spaß beim Verstehen...

Re: Liste Summen von bestimmten Feldern
Verfasst: Mittwoch 1. April 2020, 11:29
von __blackjack__
@snafu: Gefällt mir.
Schön kompakt und IMHO auch wirklich verständlich wenn man Python kann. Würde ich fast genau so real lösen, nur das ich für den `zip()`-Teilausdruck `more_itertools.grouper()` genommen hätte, einfach um das Rad nicht neu zu erfinden. Das macht intern aber fast genau das gleiche. Also mit der Beschränkung keine Module zu verwenden, sieht das halt so aus wie es bei Dir aussieht.