简体   繁体   English

有没有更好的方法来遍历循环内字典中的键?

[英]Is there a better way to iterate through the keys in a dictionary inside a loop?

I have a script that calculates the nutritional information of a recipe.我有一个计算食谱营养信息的脚本。 The user inputs the names of the ingredients, the proportion of the ingredients in grams, and supplies a.txt file where the nutritional information for each ingredient is stored (per 100g) which is actually a dictionary whose keys are the ingredients and the different values (kcal, kj, fat, etc) are lists inside each key.用户输入成分的名称,成分的克数比例,并提供一个.txt文件,其中存储了每种成分的营养信息(每100克),这实际上是一个字典,其键是成分和不同的值(kcal、kj、fat 等)是每个键内的列表。 So as an example let's say the ingredients are eggplant, olive oil and lemon juice.例如,假设成分是茄子、橄榄油和柠檬汁。

The script would have the following info so far:到目前为止,该脚本将包含以下信息:

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

Now what I need to do is to:现在我需要做的是:

  • calculate the total kcal, kj, fat and so on for the total recipe (325g in this case)计算总配方的总千卡、千焦、脂肪等(本例中为 325 克)
  • calculate the total kcal, kj, fat and so on per 100g of the recipe.计算每100g配方的总千卡、千焦、脂肪等。

My script works, but it is very ugly and improving it would make me learn better ways to get the desired results.我的脚本有效,但它非常难看,改进它会让我学习更好的方法来获得预期的结果。

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

So my question is: Is there a better way to iterate through the nutrition_dict keys?所以我的问题是:有没有更好的方法来遍历 Nutrition_dict 键?

I would also like the print statements to be 'total information' and iterate through everything, then 'per 100g information' and iterate through everything.我还希望打印语句是“总信息”并遍历所有内容,然后是“每 100g 信息”并遍历所有内容。 I don't like the current 'total, per 100g, total, per 100g'我不喜欢当前的“总计,每 100 克,总计,每 100 克”

There is, you probably want to just zip the nutrition_dict keys with the values from each food in nutrition_file :有,您可能只想zip使用 Nutrition_file 中每种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]

Then all you need to do is collect totals:然后你需要做的就是收集总数:

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}

The thing you're looking for is enumerate, which lets you (in this case) go through the keys of a dictionary while numbering them in order at the same time.您正在寻找的是枚举,它可以让您(在这种情况下)通过字典的键 go 同时按顺序对它们进行编号。 Complete solution is完整的解决方案是

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))

As an aside, kJ and kcal are the same quantity in different units (a factor is 4.184), so there's no need to keep track of both.顺便说一句,kJ 和 kcal 在不同单位中是相同的数量(系数是 4.184),因此无需跟踪两者。

In terms of iteration, Python has many great ways to streamline list processing.在迭代方面,Python 有很多简化列表处理的好方法。 In fact, much of your looping code can by eliminating some of "overhead" typical of other programming languages:事实上,您的大部分循环代码都可以通过消除其他编程语言的一些典型“开销”来实现:

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))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM