【问题标题】:Decreasing value in dictionary减少字典中的值
【发布时间】:2016-06-29 09:55:20
【问题描述】:

我正在学习 python,但我的程序有一个简单的问题。我有两个字典,其中一个键作为字符串,值连接到它们。可以说这是一家有水果和价格的商店。

shopping_list = ["banana", "orange", "apple"]

stock = {
    "banana": 6,
    "apple": 0,
    "orange": 32,
    "pear": 15
}

prices = {
    "banana": 4,
    "apple": 2,
    "orange": 1.5,
    "pear": 3
}

# Function to calculate the bill
def compute_bill(food):
    total = 0

    for number in food:
        if (stock[number]>0):
            total += prices[number]
            stock[number] -= 1
    return total

print compute_bill(shopping_list)

如果水果有库存,则将价格添加到账单中并减少库存数量。如果没有,请不要做任何事情。

错误信息:

使用包含 1 个苹果、1 个梨和 1 个香蕉的列表调用 compute_bill 得到 0 而不是正确的 7

我不知道为什么这段代码不能正常工作。

【问题讨论】:

  • 从那里得到回报。您希望所有项目在函数终止之前运行。
  • 所以还是不行吗?
  • @Ev.Kounis 现在工作。一条不必要的线。 :)

标签: python dictionary


【解决方案1】:

这里有两个问题:

  • 您在测试完第一个项目后立即返回,忽略其余项目。 return 退出函数,在 Python 执行它的那一刻。
  • 您在错误的地方减少库存,在循环之外。

两者都需要纠正:

def compute_bill(food):
    total = 0

    for item in food:
        if stock[item] > 0:
            # this item is in stock. Add the price to the total,
            # and reduce the stock by one.
            total += prices[item]
            stock[item] -= 1
    # with the loop done, return the total sum of all items
    # that were in stock.
    return total

现在,不是立即为您测试的第一个项目返回total,而是测试所有项目。每当您发现一件有库存的商品时,您就将该商品的价格添加到总价中,并将该商品的库存减少 1。

最后一个细节,Code Academy 测试人员会为您调用compute_bill() 函数。不要在你的代码中自己调用它,否则测试会失败,因为你已经改变了股票。删除print compute_fill(shopping_list) 行。

【讨论】:

  • 嗨,现在它告诉我在库存减少之前我正在调用该函数:“库存看起来不太正确!确保不要调用 compute_bill,因为它会改变库存!它应该包含:{'orange': 32, 'pear': 15, 'banana': 6, 'apple': 0}"
  • @Maltesse:啊,不,你不应该调用函数你自己。删除print compute_bill(shopping_list) 行,测试人员会为你
  • 谢谢,。当我通过传递 shopping_list 调用该函数时,最后一行是错误的。感谢您的帮助!
【解决方案2】:

问题在于您的函数会因为您的if 语句中的return 调用而提前终止。

按照您的代码的方式,该函数将从篮子中检查一个项目,然后退出。您拥有并且想要做的是检查所有项,将它们的价格添加到您的总价中,并根据您的供应量减少它们的库存量。为此,您的函数必须进行如下修改:

def compute_bill(food):
    total = 0

    for item in food:
        if stock[item]>0:
            total += prices[item]
            stock[item] -= 1
    return total

如您所见,else 部分也已被删除。由于如果请求的商品缺货或什至不存在,则不会采取任何行动,因此您没有理由尝试处理任何事情。

最后一点是,在这种情况下,您的 if 语句中的括号是不需要的。这是您正在做的一个非常简单的检查,并且尝试调节操作顺序是多余的,因为意义微不足道。

【讨论】:

  • @MartijnPieters 我对 OP 的问题发表了评论,并没有考虑再次解释逻辑,但你是完全正确的。现在好点了吗?
  • 好多了,感谢更新。评论是短暂的,可以随时删除。
【解决方案3】:

returns 结束函数并将值返回到函数外。如果您在循环内返回,则循环的其余部分将不再运行,您只会考虑第一项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-16
    • 2021-03-03
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多