如何对Python嵌套字典中相同键的值求和?以食品营养数据为例
动态计算嵌套字典中食品属性的总和
你有一组存储食品营养数据的嵌套字典:
bcode_lib = { 6294001819226: {"Item": "Snickers", "Fat": 6.2, "Energy": 519, "Sugars": 12.4, "Energy-kcal": 124, "Protein": 7, "Carbohydrates": 12.4, "Saturated-fat": 2.5}, 5000159366243: {"Item": "Twix", "Fat": 23.7, "Energy": 2071, "Sugars": 48.8, "Energy-kcal": 495, "Protein": 4.5, "Carbohydrates": 64.6, "Saturated-fat": 13.7}, }
需要计算所有食品的相同属性总和(如总蛋白质、总热量),但字典内容会动态变化,无法通过固定条码键求和。以下是可行的实现方案:
单个属性求和
用sum()结合生成器表达式,遍历所有食品子字典的对应属性,无需依赖固定条码:
# 计算总脂肪 total_fat = sum(item['Fat'] for item in bcode_lib.values()) print(f"Total fat is: {total_fat}") # 计算总蛋白质 total_protein = sum(item['Protein'] for item in bcode_lib.values()) print(f"Total Protein is: {total_protein}")
bcode_lib.values()会自动获取字典中所有食品的子字典,后续新增或删除条码条目时,代码无需修改即可正常运行。
批量计算所有数值属性总和
如果需要一次性计算所有可求和的营养属性(跳过Item这类字符串属性),可以写一个通用函数:
def calculate_all_totals(food_lib): totals = {} # 获取第一个食品的属性列表(假设所有食品属性结构一致) first_food = next(iter(food_lib.values())) for attr in first_food: # 仅计算数值类型的属性 if isinstance(first_food[attr], (int, float)): totals[attr] = sum(food[attr] for food in food_lib.values()) return totals # 调用函数获取所有属性总和 all_totals = calculate_all_totals(bcode_lib) # 打印示例结果 print("Total Energy:", all_totals['Energy']) print("Total Sugars:", all_totals['Sugars']) print("Total Saturated-fat:", all_totals['Saturated-fat'])
Python中没有bcode_lib[*]['Fat']这类通配符语法,但上述方法完全能满足动态字典的属性求和需求。
内容的提问来源于stack exchange,提问作者SaudAlzahri
相关产品推荐
相关产品推荐

