python中的两个词典,结果不同

mar*_*b89 2 python dictionary

我不明白为什么同样的方法适用于一个函数和字典,它不适用于第二个,即使我只是"复制"它.

allGuests = {"Alice": {"apples": 5, "pretzels": 12}, "Bob": {"ham sandwiches": 3, "apples": 2}, "Carol": {"cups": 3, "apple pies": 1}}
allCalories = {"apples": {"Calories": 100, "fat": 10}, "pretzels": {"Calories": 200, "fat": 20}, "ham sandwiches": {"Calories": 300, "fat": 30}, "cups": {"Calories": 0, "fat": 0}, "apple pies": {"Calories": 500, "fat": 50}}

def totalBrought(guests, item): 
    numBrought = 0              
    for k, v in guests.items(): 


        numBrought = numBrought + v.get(item, 0) 
    return numBrought

def totalCalories(dish, calories):
    cal = 0
    for k, v in dish.items():
        cal = cal + v.get(calories, 0)
    return cal

print(" Number of Things being brought: ")
print(" - Apples " + str(totalBrought(allGuests, "apples")))
print(" Calories of apples " + str(totalCalories(allCalories, "apples")))
print(" - Cups " + str(totalBrought(allGuests, "cups")))    
print(" - Cakes " + str(totalBrought(allGuests, "cakes")))
print(" - Ham Sandwiches " + str(totalBrought(allGuests, "ham sandwiches")))
print(" - Apple Pies " + str(totalBrought(allGuests, "apple pies")))
Run Code Online (Sandbox Code Playgroud)

(错误的)结果是:

Number of Things being brought: 
- Apples 7
Calories of apples 0
- Cups 3
- Cakes 0
- Ham Sandwiches 3
- Apple Pies 1
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释为什么它不起作用?看起来像一个简单的逻辑差距由蟒蛇初学者....提前感谢!

cs9*_*s95 6

错误在于:

def totalCalories(dish, calories):
    cal = 0
    for k, v in dish.items():
        cal = cal + v.get(calories, 0)
    return cal
Run Code Online (Sandbox Code Playgroud)

您可以依次循环遍历每个项目,例如{"Calories": 100, "fat": 10},{"Calories": 200, "fat": 20}依此类推.但是你要查询'apples'哪些不存在,你继续加0.

你已经掌握了钥匙!您无需dict再次迭代.这违背了它的目的.

你可以简单地做:

def totalCalories(dish, calories):
    return dish[calories]["Calories"]
Run Code Online (Sandbox Code Playgroud)

我相信你错误地命名了你的变量,这让你感到困惑.试试这个:

def totalCalories(calorie_dict, item):
    return calorie_dict[item]["Calories"]
Run Code Online (Sandbox Code Playgroud)