本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理
以下文章来源于python数据分析之禅 ,作者鸟哥
前言
双十一还有不到10天,购物车已经快加满了,但是钱包里就这么多钱,如何用现有的钱买到更多喜欢的东西,成为我比较头疼的事,因为我已经被各种组合加法搞晕了

于是我决定用python做个双十一购物攻略,把复杂的计算过程交给电脑解决,自动列出能购买哪些商品,成果如下:

下面给大家详细介绍一下实现过程:

首先将要购买的商品及价格放入表格中:

用pandas读取表格,并将商品名称和价格组合成字典:
import pandas as pd
data=pd.read_excel('商品.xlsx')
goods_price={}
for i,j in zip(list(data['名称']),list(data['原价'])):
goods_price[i]=j
goods_price
{'训练短袖': 259,
'训练外套': 589,
'运动鞋': 389,
'跑步鞋': 788,
'卫衣': 209,
'台灯': 119,
'书籍': 246}
计算商品总价和折扣情况并输出
all_price=sum([int(goods_price[good]) for good in list(goods_price.keys())]) #求商品总价格
all_discount=int(all_price/300)
print('全部商品原价总额为{}元'.format(all_price))
print('全部商品可以满减{0}次'.format(all_discount))
print('满减后商品价格总额为{}元'.format(all_price-40*all_discount)) #每满300减40
全部商品原价总额为2599元
全部商品可以满减8次
满减后商品价格总额为2279元
输入购买力
money_max=int(input('请输入购买最大金额:'))
money_min=int(input('请输入购买最小金额:'))
对所有商品进行组合
import itertools
goods1=list(goods_price.keys())
goods2 = []
for i in range(1,len(goods1)+1):
iter = itertools.combinations(goods1,i)
goods2.append(list(iter))

以商品组合为键,价格为值,创建字典
results={}
for i in goods2:
for j in i:
sum_price = 0
sum_price+=sum([int(goods_price[k]) for k in j])
results[j]=sum_price

输出满足条件的满减商品
for i in list(results.keys()):
last_price=results[i]-int(results[i]/300)*40
if last_price>money_min and last_price<money_max:
print('{0:{3}^20}\t{1:{3}^10}\t{2:^10}'.format(' '.join(i), '原价为{}元'.format(results[i]),
'满减后价格为{}元'.format(last_price),chr(12288)))

最终的成果如下图:
