Python - 购买 X 的逻辑在购物篮中免费获得最便宜的
Python - Logic for Buy X get cheapest free in shopping basket
我们提供购买 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
函数重写为:
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
中获取的免费物品数量
注意事项
getting the cheapest free with any of the following
但是,当前的更改和原始代码库都没有考虑 cheapest
产品来计算报价。
证据是 offer
函数只是在查找项目名称中的子字符串 "Shampoo"
。因此它不会根据价格对洗发水产品(大号、中号、小号)进行分类。它使用篮子条目的初始顺序。
在相同的方向上,当前的更改(我很确定原始代码库也是如此)不支持在两个不同的组上应用报价。给定原始示例:
basket_3 = {'Shampoo (Large)' : 3,
'Shampoo (Medium)' : 1,
'Shampoo (Small)': 2}
算法将从 Shampoo (Large)
开始并询问:
“这个组是否有 3
项或更多项?”。 “哦,是的,所以 1 应该是免费的”。
然后,它会继续下一组 Shampoo (Medium)
并再次问同样的问题,所以答案将是:“没有。只有 1 个项目”。最后,它将通过最后一组 Shampoo (Small)
,答案将再次是:“”不。只有2件”,完全忘记了上一组,想不到上一组的1件加上现在的2件就可以免费赠送1件了。
支持该功能所需的更改肯定比当前代码库复杂。
我们提供购买 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
函数重写为:
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
注意事项
getting the cheapest free with any of the following
但是,当前的更改和原始代码库都没有考虑 cheapest
产品来计算报价。
证据是 offer
函数只是在查找项目名称中的子字符串 "Shampoo"
。因此它不会根据价格对洗发水产品(大号、中号、小号)进行分类。它使用篮子条目的初始顺序。
在相同的方向上,当前的更改(我很确定原始代码库也是如此)不支持在两个不同的组上应用报价。给定原始示例:
basket_3 = {'Shampoo (Large)' : 3,
'Shampoo (Medium)' : 1,
'Shampoo (Small)': 2}
算法将从 Shampoo (Large)
开始并询问:
“这个组是否有 3
项或更多项?”。 “哦,是的,所以 1 应该是免费的”。
然后,它会继续下一组 Shampoo (Medium)
并再次问同样的问题,所以答案将是:“没有。只有 1 个项目”。最后,它将通过最后一组 Shampoo (Small)
,答案将再次是:“”不。只有2件”,完全忘记了上一组,想不到上一组的1件加上现在的2件就可以免费赠送1件了。
支持该功能所需的更改肯定比当前代码库复杂。