- 本博客主要通过截至目前所学所有对数字重复统计的算法进行总结,主要算法分为两类:列表方法、字典方法。
- 题目:随机产生10个数字,每个数字取值范围[1,20],打印每一个数字及其重复的次数(为避免代码重复,设定这10个随机数存储于列表中[20, 16, 3, 13, 14, 6, 6, 6, 17, 17])
一、列表类方法
1、根据取值范围新建专用于计数的列表,并用count函数统计每个数字的重复数字。
- 适用于取值范围较小计算,且虽已经进行优化,但使用count函数,效率依旧较低
lst = [20, 16, 3, 13, 14, 6, 6, 6, 17, 17]
count = [0] * 20
for i in lst:
if count[i-1] != 0:
continue
count[i-1] = lst.count(i)
for j in range(len(lst)):
print('nums:{:<2} dig:{}'.format(lst[j],count[j-1]))
2、根据取值范围新建专用于计数的列表,记录每个数字的重复数字。
- 适用于取值范围较小,否则造成内存空间浪费
lst = [20, 16, 3, 13, 14, 6, 6, 6, 17, 17]
count = [0] * 20
for i in lst:
count[i-1] += 1
for j in range(len(lst)):
print('nums:{:<2} dig:{}'.format(lst[j],count[j-1]))
二、字典类方法
1、利用fromkeys构建{keys:重复次数}的字典,利用字典keys不重复特性统计每个数字重复次数
- 所需内存空间较列表类方法少,效率高
lst = [20, 16, 3, 13, 14, 6, 6, 6, 17, 17]
dic = dict.fromkeys(lst,0)
for i in lst:
dic[i] += 1
for k,v in dic.items():
print('nums:{:<2} dig:{}'.format(k,v))
2、根据列表数字创建空列表,利用dict.get() / dict.setdefault()添加键值对,从而利用字典keys不重复特性统计每个数字重复次数。
- 所需内存空间较列表类方法少,效率高
lst = [20, 16, 3, 13, 14, 6, 6, 6, 17, 17]
dic = {}
for i in lst:
dic[i] = dic.get(i,0) + 1 #可替换为dic[i] = dic.setdefault(i,0) + 1
for k,v in dic.items():
print('nums:{:<2} dig:{}'.format(k,v))
三、总结
- 综合比较以上两类方法,在计算数字重复统计类问题时,采用字典方法不仅可以简化代码、减少内存空间利用,而且可较大提升效率。