首页 > 解决方案 > Python - 购买 X 的逻辑在购物篮中免费获得最便宜

问题描述

我们提供购买 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

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

我怎样才能解决这个问题?

标签: pythonpython-3.xlogic

解决方案


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

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

这对我来说更有意义,特别是因为命名参数buy并且free我将其解释为:“每个buy单元free都应该是免费的”。

通过应用这些更改,buy_packs变量现在计算:“购买有多少组尺寸buy?所以free*buy_packs将计算我们应该从中获取的免费物品的数量purchased

注意事项

使用以下任何一项免费获得最便宜的

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

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

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

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

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

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


推荐阅读