sum dict value

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,
Ich habe hier ( http://stackoverflow.com/questions/3490 ... t-elements ) eine Loesung gefunden wie man values summiert, aber das problem ist ein wenig anders.

Code: Alles auswählen

>>> from operator import itemgetter
>>> a = {'a': {'G, T': 1, 'A, G': 1, 'C, T': 1}, 'b': {'G, T': 3, 'A, G': 2, 'C, T': 1}}
>>> {k:sum(map(itemgetter(k), a)) for k in a[0]}
Wie koente man diese Ausgabe bekommen
{'A, G': 3, 'C, T': 2, 'G, T': 4}
oder
A, G = 3, C, T =2, G, T = 4

Vielen Dank im Vorraus.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dort stand doch eine Lösung via `collections.Counter`. Das kann man doch einfach dapatieren?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Oder mit einem collections.defaultdict:

Code: Alles auswählen

import collections

d = collections.defaultdict(int)

for values in a.values():
    for k, v in values.iteritems():
        d[k] += v
Damit hättest Du dann ein dictionary, das die keys aus a zusammenführt und die dahinterliegenden values summiert. Oder so.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Danke!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Da Du keinen Transfer leisten wolltest, hier noch die adaptierte Lösung aus Deinem Link:

Code: Alles auswählen

In [8]: data = {'a': {'G, T': 1, 'A, G': 1, 'C, T': 1}, 'b': {'G, T': 3, 'A, G': 2, 'C, T': 1}}

In [9]: from collections import Counter

In [10]: c = Counter()

In [11]: for value in data.values():
   ....:     c.update(value)
   ....:     
   ....:     

In [12]: c
Out[12]: Counter({'G, T': 4, 'A, G': 3, 'C, T': 2})
Finde ich fast eleganter als die Lösung per `defaultdict`.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Danke.
Antworten