Python字典特定键值(amount)求和报错,求高效实现方案
嘿,我来帮你搞定这个报错问题!
你触发的TypeError: 'int' object is not iterable其实很好理解:sum()函数要求传入一个可迭代对象(比如列表、生成器、元组这类能逐个取元素的东西),但你代码里的v['amount']是个单个整数,直接丢给sum,它自然不知道怎么“迭代”这个整数,就报错了。
接下来分两种常见场景给你高效的实现方式:
场景1:按键分组,计算每组的amount总和
如果你的school字典是每个键对应一个列表,列表里是多个带amount字段的字典(这是很常见的分组存储场景),比如:
school = { 'math_class': [{'amount': 25}, {'amount': 35}, {'amount': 40}], 'english_class': [{'amount': 50}, {'amount': 60}] }
那正确的字典推导式应该这么写:
grouped_sum = {k: sum(item['amount'] for item in v) for k, v in school.items()}
这里用生成器表达式item['amount'] for item in v遍历每组里的所有字典,逐个取出amount值,再用sum()求和——生成器表达式比列表推导式更省内存,大数据量下效率更高。
场景2:计算整个字典里所有amount的总总和
如果你的school字典是每个键对应单个带amount字段的字典,比如:
school = { 'student_001': {'amount': 120}, 'student_002': {'amount': 180}, 'student_003': {'amount': 200} }
那直接用一行生成器求和就够了:
total_sum = sum(v['amount'] for v in school.values())
额外小技巧:兼容混合结构
如果你的字典里既有单个字典值,又有列表值,那可以加个简单的判断来兼容:
total_sum = 0 for value in school.values(): if isinstance(value, list): total_sum += sum(item['amount'] for item in value) elif isinstance(value, dict) and 'amount' in value: total_sum += value['amount']
内容的提问来源于stack exchange,提问作者Prashant




