Seite 1 von 1

sum dict value

Verfasst: Dienstag 24. Mai 2011, 12:57
von mit
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.

Re: sum dict value

Verfasst: Dienstag 24. Mai 2011, 13:05
von Hyperion
Dort stand doch eine Lösung via `collections.Counter`. Das kann man doch einfach dapatieren?

Re: sum dict value

Verfasst: Dienstag 24. Mai 2011, 13:38
von mutetella
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

Re: sum dict value

Verfasst: Mittwoch 25. Mai 2011, 14:12
von mit
Danke!

Re: sum dict value

Verfasst: Donnerstag 26. Mai 2011, 05:14
von Hyperion
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`.

Re: sum dict value

Verfasst: Sonntag 29. Mai 2011, 10:56
von mit
Danke.