Home > OS >  Why is my function not being printed entirely?
Why is my function not being printed entirely?

Time:11-21

So I made this function with the help of Stack Overflow users, and here it is..

def totalcal(data):
    calorie_dict = {}
    for el in data:
      food, values = el.split(':')
      a, b, c = values.split(',')
      calories = (int(a) * 5)   (int(b) * 5)   (int(c) * 9)
      calorie_dict[food] = calories
    return calorie_dict


 def rdict(recipes):
        recipes_splitted = {}
        for r in recipes:
            recipe_name, parts = r.split(":")
            recipe_parts = {}
            for part in parts.split(','):
                product, number = part.split('*')
                recipe_parts[product] = int(number)
            recipes_splitted[recipe_name] = recipe_parts
        return recipes_splitted



 def recipecal(recipes, data):
        for recipe_name in rdict(recipes):
            recipe_parts = rdict(recipes)[recipe_name]
            calories = 0
            for product in recipe_parts:
                number = recipe_parts[product]
                calories  = number * totalcal(data)[product]
            return calories

print(recipecal(["Pork Stew:Cabbage*5,Carrot*1,Fatty Pork*10",
    "Green Salad1:Cabbage*10,Carrot*2,Pineapple*5",
    "T-Bone:Carrot*2,Steak Meat*1"]
    ,["Cabbage:4,2,0", "Carrot:9,1,5", "Fatty Pork:431,1,5",
    "Pineapple:7,1,0", "Steak Meat:5,20,10", "Rabbit Meat:7,2,20"]))

This function works, however, for recipecal(recipes, data) only the solution for the first input in the list is being printed out, like the output is only this...

22295

which is the result of ["Pork Stew:Cabbage*5,Carrot*1,Fatty Pork*10", but my code ignores the rest of the inputs from the list.. what should I change here to make it work??

CodePudding user response:

The execution of the return calories is too early because it is inside the loop and thus also finishes the loop thats why the other entries were not processed.

The solution to this is to place it outside the inner loop. When this is the case, what happens is that the return calories only prints the last entry, which is not what you want.

So the final solution is to create a list that will store the calories for each recipe and return that list.

the edit should be like this

def recipecal(recipes, data):
        calories_list = []
        for recipe_name in rdict(recipes):
            recipe_parts = rdict(recipes)[recipe_name]
            calories = 0
            for product in recipe_parts:
                number = recipe_parts[product]
                calories  = number * totalcal(data)[product]
            calories_list.append(calories)
        return calories_list

OUTPUT

[22295, 690, 405]

If you wanted the total sum of all calories then just use sum(list)

CodePudding user response:

You have a return statement inside the for recipe_name in rdict(recipes): loop, so it will return before looping and will never get to the other elements. Fix it by moving calories = 0 and return calories out of your loop.

def recipecal(recipes, data):
    calories = 0
    for recipe_name in rdict(recipes):
        recipe_parts = rdict(recipes)[recipe_name]
        for product in recipe_parts:
            number = recipe_parts[product]
            calories  = number * totalcal(data)[product]
    return calories
  • Related