在字典中合并/求和字典
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
总结这些值...
和往常一样,它比我尝试过的东西要容易得多,而且效果很好。以上是关于在字典中合并/求和字典的主要内容,如果未能解决你的问题,请参考以下文章