Seite 1 von 1

dict values summieren

Verfasst: Montag 5. Mai 2014, 10:51
von mit
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.

Re: dict values summiren

Verfasst: Montag 5. Mai 2014, 11:20
von anogayales
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

Re: dict values summiren

Verfasst: Montag 5. Mai 2014, 12:21
von Hyperion
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 ;-)

Re: dict values summiren

Verfasst: Montag 5. Mai 2014, 12:37
von DeaD_EyE

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))

Re: dict values summiren

Verfasst: Montag 5. Mai 2014, 13:33
von anogayales
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

Re: dict values summiren

Verfasst: Montag 5. Mai 2014, 14:06
von Hyperion
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>

Re: dict values summiren

Verfasst: Montag 5. Mai 2014, 14:13
von /me
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.

Re: dict values summiren

Verfasst: Montag 5. Mai 2014, 14:14
von cofi
@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 ;)

Re: dict values summiren

Verfasst: Dienstag 6. Mai 2014, 14:31
von mit
Vielen Dank für alle Lösungen.

Re: dict values summiren

Verfasst: Mittwoch 7. Mai 2014, 00:34
von derdon
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)

Re: dict values summiren

Verfasst: Mittwoch 7. Mai 2014, 01:35
von cofi
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? :)

Re: dict values summiren

Verfasst: Mittwoch 7. Mai 2014, 01:41
von EyDu
cofi hat geschrieben:Gut, dann denken wir uns einfach die eckigen Klammern weg, ja? :)
Welche eckigen Klammern? ;-)