我有一个计算食谱营养信息的脚本。用户输入成分的名称,成分的克数比例,并提供一个。txt文件,其中存储了每种成分的营养信息(每100g),该文件实际上是一个字典,其键是成分,不同的值(kcal, kj, fat等)是每个键中的列表。例如,我们假设配料是茄子、橄榄油和柠檬汁。
到目前为止,脚本将包含以下信息:
nutrition_dict = {'kcal': 0, 'kj': 0, 'fat': 0, 'saturated fat': 0, 'carbohydrates': 0, 'sugar': 0, 'protein': 0, 'salt': 0}
nutrition_file = {'eggplant':[24, 100, 0.2, 0, 5.7, 2.4, 1, 0.005], 'olive oil':[884, 3701, 100, 13.8, 0, 0, 0, 0.005], 'lemon juice':[25, 105, 0, 0, 8.6, 2.4, 0.4, 0.0025]}
amount_of_ingredients = {'eggplant': 300, 'olive oil': 20, 'lemon juice': 5}
total_desired_recipe = 325
现在我需要做的是:
- 计算总配方(本例中为325g)的总kcal, kj,脂肪等
- 计算每100g配方的总热量、千焦、脂肪等。
我的脚本工作,但它是非常丑陋的,改进它将使我学习更好的方法来获得期望的结果。
for key in nutrition_file:
i = 0
for i in range(8):
if i == 0:
nutrition_dict['kcal'] = nutrition_dict['kcal'] + nutrition_file[key][i]
elif i == 1:
nutrition_dict['kj'] = nutrition_dict['kj'] + nutrition_file[key][i]
elif i == 2:
nutrition_dict['fat'] = nutrition_dict['fat'] + nutrition_file[key][i]
elif i == 3:
nutrition_dict['saturated fat'] = nutrition_dict['saturated fat'] + nutrition_file[key][i]
elif i == 4:
nutrition_dict['carbohydrates'] = nutrition_dict['carbohydrates'] + nutrition_file[key][i]
elif i == 5:
nutrition_dict['sugar'] = nutrition_dict['sugar'] + nutrition_file[key][i]
elif i == 6:
nutrition_dict['protein'] = nutrition_dict['protein'] + nutrition_file[key][i]
elif i == 7:
nutrition_dict['salt'] = nutrition_dict['salt'] + nutrition_file[key][i]
i += 1
for key, value in nutrition_dict.items():
print("The total of {} is: {:.2f}".format(key, value))
nutrition = (value * 100) / total_desired_recipe
print("The amount of {} per 100g is: {:.2f}".format(key, nutrition))
i += 1
所以我的问题是:有没有更好的方法来迭代nutrition_dict键?
我还希望打印语句是"总信息"并遍历所有内容,然后是"每100g信息"并遍历所有内容。我不喜欢现在的"total, per 100g, total, per 100g">
有,你可能只是想zip
nutrition_dict
键与nutrition_file
中每种食物的值:
for k, *v in zip(nutrition_dict, *nutrition_file.values()):
print(k, v)
kcal [24, 884, 25]
kj [100, 3701, 105]
fat [0.2, 100, 0]
saturated fat [0, 13.8, 0]
carbohydrates [5.7, 0, 8.6]
sugar [2.4, 0, 2.4]
protein [1, 0, 0.4]
salt [0.005, 0.005, 0.0025]
那么你所需要做的就是收集总数:
for k, *v in zip(nutrition_dict, *nutrition_file.values()):
nutrition_dict[k] = sum(v)
nutrition_dict
{'kcal': 933, 'kj': 3906, 'fat': 100.2, 'saturated fat': 13.8, 'carbohydrates': 14.3, 'sugar': 4.8, 'protein': 1.4, 'salt': 0.0125}
您要查找的是enumerate,它允许您(在本例中)遍历字典的键,同时按顺序对它们进行编号。完整解
for index, key in enumerate(nutrition_dict):
for ingredient_name, ingredient_amount in amount_of_ingredients.items():
nutrition_dict[key] += ingredient_amount * nutrition_file[ingredient_name][index]
print("The total of {} is: {:.2f}".format(key, nutrition_dict[key]))
nutrition = (nutrition_dict[key] * 100) / total_desired_recipe
print("The amount of {} per 100g is: {:.2f}".format(key, nutrition))
顺便说一下,kJ和kcal是不同单位的相同数量(系数为4.184),所以没有必要同时跟踪它们。
在迭代方面,Python有许多很棒的方法来简化列表处理。事实上,很多循环代码可以通过消除一些"开销"来实现。典型的其他编程语言:
for food_type in nutrition_file:
for index, metric in enumerate(nutrition_dict):
nutrition_dict[metric] += nutrition_file[food_type][index]
# Unchanged from OP's example
for key, value in nutrition_dict.items():
print("The total of {} is: {:.2f}".format(key, value))
nutrition = (value * 100) / total_desired_recipe
print("The amount of {} per 100g is: {:.2f}".format(key, nutrition))