嵌套字典:嵌套为字典值的字典相同键的值

Jan*_*Jan 1 python dictionary python-2.7

我想要对相同键的值进行求和:H, C, O, N, S根据字典composition输入字符串的组合A, C, D, E.

composition = {
    'A':  {'H': 5, 'C': 3, 'O': 1, 'N': 1},
    'C':  {'H': 5, 'C': 3, 'O': 1, 'N': 1, 'S': 1},
    'D':  {'H': 5, 'C': 4, 'O': 3, 'N': 1},
    'E':  {'H': 7, 'C': 5, 'O': 3, 'N': 1},
}

string_input = ['ACDE', 'CCCDA']
Run Code Online (Sandbox Code Playgroud)

预期的结果应该是

out = {
    'ACDE' : {'H': 22, 'C': 15, 'O': 8, 'N': 4, 'S': 1},
    'CCCDA' : {'H': 15, 'C': 9, 'O': 3, 'N': 3, 'S': 3},
}
Run Code Online (Sandbox Code Playgroud)

我试图使用Counter但坚持unsupported operand type(s) for +: 'int' and 'Counter'

from collections import Counter

for each in string_input:
  out = sum(Counter(composition[aa]) for aa in each)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

sum()有一个起始值,从中开始总和.如果第一个参数中没有要求和的值,这也会提供默认值.该起始值是0整数.

sum()功能文档:

sum(iterable[, start])

Sums 从左到右开始可迭代的项目并返回总数.开始默认为0.

在对Counter对象求和时,给它一个空Counter()的开始:

sum((Counter(composition[aa]) for aa in each), Counter())
Run Code Online (Sandbox Code Playgroud)

如果您随后将结果分配给分配给您的字典中,则将您的预期结果作为实例获取:outCounter

>>> out = {}
>>> for each in string_input:
...     out[each] = sum((Counter(composition[aa]) for aa in each), Counter())
...
>>> out
{'ACDE': Counter({'H': 22, 'C': 15, 'O': 8, 'N': 4, 'S': 1}), 'CCCDA': Counter({'H': 25, 'C': 16, 'O': 7, 'N': 5, 'S': 3})}
Run Code Online (Sandbox Code Playgroud)