在字典中合并/求和字典

Posted

技术标签:

【中文标题】在字典中合并/求和字典【英文标题】: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()。 ------------- 或者使用熊猫。 【参考方案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 总结这些值... 和往常一样,它比我尝试过的东西要容易得多,而且效果很好。

以上是关于在字典中合并/求和字典的主要内容,如果未能解决你的问题,请参考以下文章

7-11 字典合并 (40 分)

使用来自另一个合并字典的合并字典中定义的样式

在Python中合并字典的层次结构

第5章-11 字典合并 (40分)

字典理解中的字典合并

如何在一个表达式中合并两个字典(取字典并集)?