dict values summieren

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
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Hallo,
Wie ist es möglich von einem Dict allen
* Keys >= 1 alle values zu summieren
* Keys >= 3 alle values zu summieren
* Keys >= 9 alle values zu summieren?

Dict:

Code: Alles auswählen

a = {1: 1403524, 2: 1230857, 3: 1152603, 4: 1100013, 5: 1061889, 6: 1037205, 7: 1006915, 8: 970252, 9: 936039, 10: 903263, 11: 865307, 12: 828445, 13: 778958, 14: 730178, 15: 682208, 16: 634835, 17: 586743, 18: 537117, 19: 495972, 20: 447554, 21: 411236, 22: 375286, 23: 336369, 24: 303170, 25: 272981, 26: 244315, 27: 219504, 28: 193789, 29: 175229, 30: 154632, 31: 137100, 32: 119811, 33: 105205, 34: 92065}
Output

Code: Alles auswählen

1	=	20530569
3	=	17896188	
9	=	11567311
Vielen Dank im Voraus.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Was hast du den bisher probiert?

Hinweis:
Die keys eines Dictionaries bekommt man übrigens mittels "a.keys()".

Hast du schonmal von List Comprehensions gehört? Damit ist die Aufgabe relativ zügig relöst.

Diese Funktion wird dir auch weiter helfen: https://docs.python.org/2/library/functions.html#sum

Grüße,
anogayales
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

anogayales hat geschrieben: Die keys eines Dictionaries bekommt man übrigens mittels "a.keys()".
Für diese Aufgabe ist aber die Methode ``items()`` (bzw. ``iteritems()`` in Python 2.x) hilfreicher ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
DeaD_EyE
User
Beiträge: 1017
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Code: Alles auswählen

a = {1: 1403524, 2: 1230857, 3: 1152603, 4: 1100013, 5: 1061889, 6: 1037205, 7: 1006915, 8: 970252, 9: 936039, 10: 903263, 11: 865307, 12: 828445, 13: 778958, 14: 730178, 15: 682208, 16: 634835, 17: 586743, 18: 537117, 19: 495972, 20: 447554, 21: 411236, 22: 375286, 23: 336369, 24: 303170, 25: 272981, 26: 244315, 27: 219504, 28: 193789, 29: 175229, 30: 154632, 31: 137100, 32: 119811, 33: 105205, 34: 92065}


def foomagic(d, sum_key_list):
    ret_list = [0] * len(sum_key_list) #array mit 0 initalisieren
    for n, sum_begin in enumerate(sum_key_list):
        for k, v in a.iteritems():
            if k >= sum_begin:
                ret_list[n] += v
    return ret_list

print foomagic(a, (1,3,9))
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Hyperion hat geschrieben:
anogayales hat geschrieben: Die keys eines Dictionaries bekommt man übrigens mittels "a.keys()".
Für diese Aufgabe ist aber die Methode ``items()`` (bzw. ``iteritems()`` in Python 2.x) hilfreicher ;-)
Ich finde die Lösung mit keys lesbarer ;) Ob sie jetzt hilfreicher ist, sei mal dahin gestellt.

Code: Alles auswählen

sum_above_threshold= lambda threshold : sum([a[key] for key in a.keys() if key >= threshold])
vs

Code: Alles auswählen

sum_above_threshold = lambda threshold : sum([item for key, item in a.items() if key >= threshold])
@OP: Falls du obigen Code nicht verstehst, schau die dringend List Comprehensions ans! Fang auf keine Fall an das Problem mit einer normalen Schleife zu lösen.

EDIT: Und auf keinen Fall wie DeaD_EyE! Diese Lösung verwendet unpythonische Konstrukte, wie z.B. das initialisieren einer Liste mit Nullen (siehe Zeile 5).

Grüße,
anogayales
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

anogayales hat geschrieben: Ich finde die Lösung mit keys lesbarer ;) Ob sie jetzt hilfreicher ist, sei mal dahin gestellt.
Oopsi, ich war so auf den zugehörigen Wert fixiert, dass ich die Möglichkeit des Aufrufs über den Key vollkommen ignoriert hatte :oops:

<rausred>
Man müsste das mal messen, aber evtl. ist die ``items``-Variante schneller (Man spart sich die Lookup-Operation) :mrgreen:
</rausred>
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

anogayales hat geschrieben:

Code: Alles auswählen

sum_above_threshold = lambda threshold : sum([item for key, item in a.items() if key >= threshold])
Die List-Comprehension kann man sich noch sparen, da reicht auch der Generator-Ausdruck.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@anagoyales "auf keinen Fall" :roll:

@DeaD_EyE: Wobei er aber Recht hat ist, dass man eigentlich eine List Comprehension moechte wenn man erst eine Liste mit Dummy-Werten erstellt, um sie dann spaeter auszutauschen. Oder man benutzt direkt ein Dictionary, je nach Problem.

@Problem: Pah, wer braucht schon List Comprehensions:

Code: Alles auswählen

In [2]: dict([(threshold, sum(v for k, v in a.items() if k >= threshold)) for threshold in [1,3,9]])
Out[2]: {1: 20530569, 3: 17896188, 9: 11567311}

In [3]: #ab python 2.7

In [4]: {threshold: sum(v for k, v in a.items() if k >= threshold) for threshold in [1,3,9]}
Out[4]: {1: 20530569, 3: 17896188, 9: 11567311}
Ich bevorzuge allerdings auch die `items` Variante, weil hier einfach klarer ist, dass es sowohl um die Keys als auch um die Werte geht. Wie der Zugriff auf den Wert ueber den Key der Lesbarkeit hilft uebersteigt aber meinen Horizont ... Das duerfte vor allem eine Sache der Gewohnheit sein. Wenn man aber schon die keys benutzt, sollte man sich `.keys()` sparen ;)
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Vielen Dank für alle Lösungen.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

cofi hat geschrieben: @Problem: Pah, wer braucht schon List Comprehensions:

Code: Alles auswählen

In [2]: dict([(threshold, sum(v for k, v in a.items() if k >= threshold)) for threshold in [1,3,9]])
Out[2]: {1: 20530569, 3: 17896188, 9: 11567311}
Du anscheinend :twisted: (der Ausdruck, der an dict() übergeben wird, ist eine LC)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Verdammt, das hab ich heute mittag entdeckt und dachte mir "ach das merkt eh keiner" :roll:

Gut, dann denken wir uns einfach die eckigen Klammern weg, ja? :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

cofi hat geschrieben:Gut, dann denken wir uns einfach die eckigen Klammern weg, ja? :)
Welche eckigen Klammern? ;-)
Das Leben ist wie ein Tennisball.
Antworten