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.
Liste Summen von bestimmten Feldern
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:
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.
Code: Alles auswählen
[(2.0, "DN20"), (4.5, "DN25"), (2.4, "DN20"), (0.0, "DN40"), (7.8, "DN25")]
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.
- 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
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
- 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:
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.
-
- 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:
@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)
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.
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.
-
- 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?
2. funktionieren alle gezeigten Lösungsvorschläge. Wo ist also dein Problem?
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.
- 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
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
-
- 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.
Wenn du die nötige Frage zur Lösung deines Problems als Überheblichkeit empfindest, kann ich dir auch nicht helfen.
Da anscheinend eine Komplettlösung gewünscht ist: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.
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)

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