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