【问题标题】:merging/summing dictionaries in dictionaries在字典中合并/求和字典
【发布时间】:2017-08-03 08:28:45
【问题描述】:

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 等)所有基因的所有值?

【问题讨论】:

  • 创建一个函数f,其输入为{'gene1' : {'val': 2, 'thr' : 4, 'met' : 5}, 'gene2' : {'val': 3, 'thr' : 6, 'met' : 7}}并返回{'genes' : {'val': 5, 'thr' : 10, 'met' : 12}}。现在应用字典理解:{k: f(v) for k, v in database.items()}。 ------------- 或者使用熊猫。

标签: python dictionary sum python-3.5


【解决方案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}

【讨论】:

  • 他希望将结果写入新的输出database2
  • 就像我说的,我拥有更多的一切。有 20 个氨基酸,所以这将是一大堆线条。
【解决方案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 中的字典没有固有顺序:键可以有任意顺序。

【讨论】:

  • @MaximedePachtere:因为dict.update(..) 覆盖这些值。 Counter.update 总结这些值...
  • 和往常一样,它比我尝试过的东西要容易得多,而且效果很好。
猜你喜欢
  • 2018-04-16
  • 2018-10-23
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 2019-05-16
相关资源
最近更新 更多