今天想解决个实际问题:假如有一个商品销售情况的表,表中记录着不同商品每个月的销售量。我要怎么查出某个商品销售连续增长的月数呢?
这个问题我用sql没太想到很好的解决办法,于是想着写程序来实现。在程序里面这个问题可以简化成在一个数组里连续增长的个数。
比如一个数组是:xsqk = [1,2,3,4,3,1,2], 我期望得到的结果是:[0,1,2,3,0,0,1] 其中每个 值代表的是连续增长的次数,比如第2个数是2,他只比前面的一个数1大,那么第二个数组对应的位置 就是1,依次类推。
下面是代码:
xsqk = [1,2,3,4,3,1,2]
result = [0,]
n=0
for k,_ in enumerate(xsqk):
if k==0:
continue
else:
if xsqk[k]> xsqk[k-1]: # 如果要计算连续增长超过10%的,只需要改成xsqk[k]>1.1* xsqk[k-1]
n=n+1
else:
n=0
result.append(n)
print(result)
>>>
[0, 1, 2, 3, 0, 0, 1]
其实做出来后,感觉这个问题还是挺简单的,但是想出这段代码还花了我一点的时间,因为开始没想到弄个计数器,一次遍历就可以了,开始想的算法是对每一个数遍历他前面所有的数,依次判断大小。我还想着用递归的写法来实现。
xsqk = [1,2,3,4,3,1,2]
def fun(l):
if len(l)==1:
return 0
elif len(l)>1:
l_front = l[:-1]
l_last = l[-1]
if l_last>l_front[-1]:
return 1+fun(l_front)
else:
return 0
print(fun(xsqk))
>>>
1
但这个递归只能计算出列表最后一个元素是连续多少次增长,效率还是不高。
总结:
有些问题要把算法这块抽离出来单独实现,比如我这个需求,如果按照过程化的思维来看,要判断商品a在5月的销售是连续增长了几个月,那么就需要依次去查他4月、3月、2月……的销售量,然后判断增长了几个月。但是这样反复的查数据库,可能效率会很低,并且假如又换个需求想查他2月是连续增长了几个月,就又需要把这个工作再重复一遍,不如一次性把商品a的销售额都取出来,对整个数组里每个值做连续增长的判断。通过简化,我就不用考虑怎么反复的取数据库的问题,只用考虑怎么处理一个数组的问题了。这也是编程中模块化思维的一个体现吧。