Liste Summen von bestimmten Feldern

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
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

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.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
noisefloor
User
Beiträge: 4193
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@noisefloor: mit einem Index sollte man erst gar nicht anfangen. Das gibt keinen schönen Python-Code.
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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}
In specifications, Murphy's Law supersedes Ohm's.
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

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)
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

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.
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

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?
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

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.
Benutzeravatar
noisefloor
User
Beiträge: 4193
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

@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.
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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... ;)
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten