合并/求词典中的词典

时间:2017-03-13 10:44:53

标签: python dictionary sum python-3.5

Python 3.5

我有一本字典,其中包含多个词典,其中包含多个词典。它看起来像这样(简化):

database = {'HIV' : {'gene1' : {'val': 2, 'thr' : 4, 'met' : 5}, 
                  'gene2' : {'val': 3, 'thr' : 6, 'met' : 7}},
           'HIV2' : {'gene1' : {'val': 4, 'thr' : 1, 'met' : 6}, 
                   'gene2' : {'val': 7, 'thr' : 9, 'met' : 8}}
           }

显然我有更多的东西。 我想要合并所有基因(在新词典中,所以它看起来像:

database2 = {'HIV' : {'genes' : {'val': 5, 'thr' : 10, 'met' : 12}},
           'HIV2' : {'genes' : {'val': 11, 'thr' : 10, 'met' : 14}}
           }

存储价值可能是一种混乱的方式,但这是我必须要处理的。 如何总结每种病毒(例如HIV,HIV2等)的所有基因的所有值?

2 个答案:

答案 0 :(得分:2)

您可以使用Counter来总结元素,然后将结果(计数器或其基础字典)添加到字典中。类似的东西:

from collections import Counter

result = {}
for key,val in database.items():
    ctr = Counter()
    for gene in val.values():
        ctr.update(gene)
    result[key] = {'genes':dict(ctr)}

这给出了:

>>> result
{'HIV2': {'genes': {'val': 11, 'thr': 10, 'met': 14}},
 'HIV': {'genes': {'val': 5, 'thr': 10, 'met': 12}}}

HIVn元素的顺序是交换的,但请注意Python-3.5中的字典没有固有的顺序:键可以有任意顺序。

答案 1 :(得分:1)

你可以通过简单的迭代来实现:

for d in database:  
    val = 0
    thr = 0
    met = 0
    for gene in database[d]:
        val += database[d][gene]["val"]
        thr += database[d][gene]["thr"]
        met += database[d][gene]["met"]
    database[d] = {}
    database[d]["genes"] = {"val": val, "thr": thr, "met": met}

对于许多领域:

result = {}
for d in database:  
    part = {}   
    for gene in database[d]:
        for field in database[d][gene]:
            if field in part:
                part[field] += database[d][gene][field]
            else:
                part[field] = database[d][gene][field]
    result[d] = {"genes": part}