Python - 购买 X 的逻辑在购物篮中免费获得最便宜

Posted

技术标签:

【中文标题】Python - 购买 X 的逻辑在购物篮中免费获得最便宜【英文标题】:Python - Logic for Buy X get cheapest free in shopping basket 【发布时间】:2021-03-18 02:55:00 【问题描述】:

我们提供购买 3 种洗发水并使用以下任何一种免费获得最便宜的优惠:

d = 'Shampoo (Small)' : 2.00,
    'Shampoo (Medium)' : 2.50,
    'Shampoo (Large)' : 3.50

鉴于篮子包含:

basket_3 = 'Shampoo (Large)' : 3,
            'Shampoo (Medium)' : 1,
            'Shampoo (Small)': 2

答案应该是:

sub-total: £17.0
discount: £5.5
total: 11.5

客户免费获得 1 个大号和 1 个小号洗发水。

我试图做的是实现一个函数来找出哪些洗发水可以免费获得

def basket(basket):
    # calculates subtotal from function
    print("Subtotal: ","%.2f" % subtotal(basket))
    print("Discount: ","%.2f" % (subtotal(basket) - discounted(basket)))
    print("Total: ","%.2f" % discounted(basket))
    return basket

def subtotal(basket):
    d = 
    for item,qty in basket.items():
        price = data[item]
        d[item]=(qty*price)
    return sum(d.values())

def discounted(basket):
    basket = offers(basket)
    d = 
    for item,qty in basket.items():
        price = data[item]
        d[item]=(qty*price)
    return sum(d.values())

def offers(basket):
    d = 
    for item,qty in basket.items():
        if 'Shampoo' in item:
            qty = shampoo(qty)
            d[item]=qty
        else:
            d.update(item:qty)        
    return d

def shampoo(purchased, buy=3, free=1):
    pack = buy - free
    buy_packs = purchased // pack
    buy_individual = purchased % pack
    return buy * buy_packs + buy_individual 

但我的结果是

Subtotal:  17.00
Discount:  -5.50
Total:  22.50

哪个得到了正确的折扣,但总数应该低于小计。

我该如何解决这个问题?

【问题讨论】:

shampoo 函数似乎无法正确计算数量。它目前正在为Shampoo (Large) 返回 4 件商品,为 Shampoo (Medium) 返还 1 件商品,为 Shampoo (Small) 返还 3 件商品。 buy * buy_packs + buy_individual 背后的逻辑是什么?问题很可能出在该函数中。结果 discounted(basket) 返回 22.5 这没有意义,因为它不应该大于 subtotal 我是从另一个 *** 答案中得到的,所以不确定。你知道如何解决吗? @乌龟 我对报价有疑问:1 支洗发水(大号)是免费的,因为您要购买其中的 3 支,对吗?在另一种情况下是免费的 1 个洗发水(小),因为您将剩余的 2 个中号 + 1 个小号组合在一起(因此小号最便宜)? 是的,这就是 OP 所声称的。我现在可以看到它是如何工作的。代码看起来仍然是颠倒的。 是的,你没看错 【参考方案1】:

我会将整个 shampoo 函数重写为:

def shampoo(purchased, buy=3, free=1):
    buy_packs = purchased // buy
    return purchased - free * (buy_packs)

这对我来说更有意义,尤其是因为命名参数 buyfree 我解释为:“每个 buy 单位,free 应该是免费的”。

通过应用这些更改,buy_packs 变量现在计算:“购买有多少组大小 buy?所以free * buy_packs 将计算我们应该从 @ 987654331@

注意事项

通过以下任何方式获得最便宜的免费

但是,当前的更改和原始代码库都没有考虑cheapest 产品来计算报价。

证明offer 函数只是在项目名称中查找子字符串"Shampoo"。因此,它不会根据价格对洗发水产品(大、中、小)进行分类。它使用购物篮条目的初始顺序。

在同一个方向上,当前的更改(我也很确定原始代码库也是如此)不支持将报价应用于两个不同的组。给定原始示例:

basket_3 = 'Shampoo (Large)' : 3,
            'Shampoo (Medium)' : 1,
            'Shampoo (Small)': 2

算法将以Shampoo (Large) 开头,并会询问: “这个组有3 或更多的项目吗?”。 “哦,是的,所以 1 应该是免费的”。 然后,它会继续下一组Shampoo (Medium) 并再次提出相同的问题,因此答案将是:“不,只有一项”。最后,它将通过最后一组Shampoo (Small),答案将再次是:“”不。只有 2 件”,完全忘记了上一组,无法意识到前 1 件加上当前 2 件就足以免费赠送 1 件。

支持该功能所需的更改肯定比当前的代码库更复杂。

【讨论】:

准确!你能解释一下这个函数到底是做什么的吗? 对不起@a.r.noureldin 我发现我的回答有误。我正在尝试修复它以使其有意义,但问题肯定出在shampoo 函数中 @a.r.noureldin 对原始答案的更改对您有意义吗?我完全重写了shampoo 函数,因为我发现它很难理解 我进一步解释了 =)。祝你好运!

以上是关于Python - 购买 X 的逻辑在购物篮中免费获得最便宜的主要内容,如果未能解决你的问题,请参考以下文章

购物商城小程序

使用python的数列相关的知识,书写购物车程序

使用python的数列相关的知识,书写购物车程序

Python小作业二(购买物品)

Python购物篮数据(关联分析)

Python之购物车