用python决定在京东和当当上买书最便宜的方案

      双十一到来,对未来满满的焦虑感一直在push着我买些书来寻求心理安慰。然而京东和当当的优惠政策不同:前者满100减50,但单价贵;而后者直接给出折后价。经过一番思想挣扎,确定了要买以下六本书,分别在京东和当当上查看了今日的价格

书名 京东 当当 方案1 方案2
计算机网络:自顶向下方法 84.6 70.3 JD JD
深入理解计算机系统 132.1 90.4 JD JD
算法导论 121.6 96 JD JD
编程之美 75.1 37.6 DD DD
剑指offer 61.8 30.9 DD JD
程序员代码面试指南 103.6 377 DD DD
合计(优惠后) 328.8 377 188.3+120.3=308.6 200.1+89.4=289.5

      根据京东和当当的价格初步选了方案1和方案2,感觉是比较实惠的。但是,在最终决定之前,贫穷让我理智了起来…
用python决定在京东和当当上买书最便宜的方案_第1张图片
      不!我要最便宜。
      于是乎,打开电脑,new一个book.py,考虑算法?不存在的,小菜鸟确实做不到哇。。。简单暴力法遍历一遍,不就六本书嘛,高中的排列组合来一下不就六六、六五、五四…这么多种情况嘛,然后写个组合的函数?
      额。。。情况有点多了,那啥,用python还要我造这个轮子吗?
用python决定在京东和当当上买书最便宜的方案_第2张图片
      python的组合嘛,找到它了,from itertools import combinations,试验一下

>>> from itertools import combinations
>>> a = list(range(0,6))
>>> list(combinations(a,2))
[(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]

      导入后,那就开始干吧。先定义京东和当当的两个价格列表

JD = [84.6, 132.1, 121.6, 75.1, 61.8, 103.6]
DD = [70.3, 90.4, 96, 37.6, 30.9, 51.8]

      首先考虑在京东上选某几本书,可能是0本、1本、2本。。。6本,找到对应的索引就好了,然后剩下的索引就是从当当买的书啦。主要的代码如下

index = list(range(0,6))
res = []
for n in range(0,7): #n=1~5
    index_arr_JD = list(combinations(index, n)) # 从京东购买书籍的索引列表,每个元素是某种情况的索引数组
    for tup in index_arr_JD: # tup对应着京东购买书籍的一种索引组合情况
        index_arr_DD = list(set(index)^set(tup)) # 从当当购买书籍的索引
        # 京东购买的图书的价格
        price_JD = sum(JD[i] for i in tup)
        price_JD -= (price_JD // 100) * 50
        # 当当购买的图书的价格
        price_DD = sum(DD[i] for i in index_arr_DD)
        # 保存数据
        item = ['京东:', tup, '京东价格', round(price_JD,2),
                '当当', index_arr_DD, '当当价格', round(price_DD,2), '总价', round(price_JD + price_DD, 2)]
        res.append(item)

      上面代码中的item保存价格数据的时候使用了round,主要是因为python的浮点数计算不准确,小数点后面会跟着很多位数。
      到这里把所有方案都保存下来了,最后,根据总价对结果排序,并打印出来就大功告成啦。

res.sort(key=lambda x: x[-1])
print('一共有%d组数据' % len(res))
for e in res:
    print(e)

      得到结果如下
用python决定在京东和当当上买书最便宜的方案_第3张图片
      排在第一的就是我在前面提出的方案2,看来我的直觉还不错!可以踏实地买书了。
      从上面的点出发,可以考虑这么一个问题:要购买N个/种商品,有m个平台给出的价格及其优惠政策,如何找到它最便宜的购买方案?
      想看问题的解决代码?
      然而
用python决定在京东和当当上买书最便宜的方案_第4张图片
      说了这么多,咳咳,总结一哈子:对于双十一,我向来是敬而远之的。现在双十一这么多平台搞活动,优惠规则这么复杂,我买几本书都要这么抠抠索索,精打细算的,对于那些要研究各种优惠规则、买大量东西的人,要是这么精打细算,岂不是头都要炸了哇。要是有个app或者网站能够帮我们解决这种问题,那可省事省钱了啊

你可能感兴趣的:(python)