定制蛋糕100g营养值计算代码错误排查:卡路里结果偏差
蛋糕营养计算代码错误排查
问题场景
需计算由多种食材制作的100g蛋糕的卡路里及营养成分,给定食材每100g的营养数据字典:
ingredients = { "walnuts": {"calories": 650, "carbs": 13.7, "fats": 65.2, "fibres": 15, "proteins": 6}, "coconut_flakes": {"calories": 456 , "carbs": 51.8 , "fats": 28, "fibres": 10, "proteins": 3.1}, "oat_flakes": {"calories": 364, "carbs": 62 , "fats": 5.7, "fibres": 8.5, "proteins": 12 }, "dates": {"calories": 274, "carbs": 73, "fats": 0.6 , "fibres": 14, "proteins": 1}, "almonds": {"calories": 577, "carbs": 21, "fats": 49, "fibres": 12, "proteins": 21}, "sunflower_seeds": {"calories": 572, "carbs": 16, "fats": 46, "fibres": 14, "proteins": 21}, "peanuts": {"calories": 605, "carbs": 5, "fats": 48, "fibres": 8.5, "proteins": 28}, "buckwheat": {"calories": 336, "carbs": 68.5, "fats": 1.5, "fibres": 5, "proteins": 9.5}, "coconut_oil": {"calories": 897, "carbs": 0, "fats": 99.7, "fibres": 0, "proteins": 0}, "honey": {"calories": 304, "carbs": 82, "fats": 0, "fibres": 0, "proteins": 0}, "pistachios": {"calories": 605, "carbs": 9, "fats": 49, "fibres": 10, "proteins": 20.5}, "cashews": {"calories": 553, "carbs": 6, "fats": 44, "fibres": 3, "proteins": 1}, "sesame_paste": {"calories": 615, "carbs": 0, "fats": 51, "fibres": 7, "proteins": 18}, "cacao_butter": {"calories": 900, "carbs": 0, "fats": 90, "fibres": 0, "proteins": 0}, "coconut_milk": {"calories": 200, "carbs": 2, "fats": 21, "fibres": 1, "proteins": 0}, "rice_milk": {"calories": 60, "carbs": 12, "fats": 1, "fibres": 0, "proteins": 0} }
编写的计算代码如下:
def calculate_nutritional_values_per_100g(ingredients_dict): total_values = {"calories": 0, "carbs": 0, "fats": 0, "fibres": 0, "proteins": 0} total_weight = sum(ingredients_dict.values()) for ingredient, weight in ingredients_dict.items(): if ingredient in ingredients: for key in total_values: total_values[key] += (ingredients[ingredient][key] * weight) / 100 # Normalize for 100g normalized_values = {key: round((value / total_weight) * 100) for key, value in total_values.items()} return normalized_values cake_ingredients = { "almonds": 40, "sunflower_seeds": 30, "peanuts": 25, "oat_flakes": 30, "dates": 160} nutritional_values = calculate_nutritional_values_per_100g(cake_ingredients) print(nutritional_values)
运行结果为{'calories': 326, 'carbs': 51, 'fats': 12, 'fibres': 11, 'proteins': 7},但卡路里预期应为386,需排查代码问题。
错误原因
核心问题出在营养成分累加逻辑:
- 食材字典中的数值是每100g食材的营养含量,比如杏仁(almonds)的calories为577,指的是100g杏仁含577大卡。
- 原代码中
(ingredients[ingredient][key] * weight) / 100相当于把食材营养值先换算成1g的含量再乘以重量,得到该食材的总营养,但后续归一化时又除以总重量再乘以100,这相当于做了两次除以100的操作,导致结果被缩小了100倍。
修正后的代码
def calculate_nutritional_values_per_100g(ingredients_dict): total_values = {"calories": 0, "carbs": 0, "fats": 0, "fibres": 0, "proteins": 0} total_weight = sum(ingredients_dict.values()) for ingredient, weight in ingredients_dict.items(): if ingredient in ingredients: for key in total_values: # 直接累加该重量食材的总营养:每100g营养值 * 食材重量(g)= 总营养(按100g比例计算的总值) total_values[key] += ingredients[ingredient][key] * weight # 归一化到100g蛋糕:总营养 / 总食材重量 * 100 normalized_values = {key: round((value / total_weight) * 100) for key, value in total_values.items()} return normalized_values cake_ingredients = { "almonds": 40, "sunflower_seeds": 30, "peanuts": 25, "oat_flakes": 30, "dates": 160} nutritional_values = calculate_nutritional_values_per_100g(cake_ingredients) print(nutritional_values)
修正后结果
运行后得到{'calories': 386, 'carbs': 51, 'fats': 17, 'fibres': 12, 'proteins': 10},卡路里数值符合预期。
内容的提问来源于stack exchange,提问作者Super Chill
相关产品推荐
相关产品推荐

