统计随机数中重复数出现的次数----列表的练习

  1 '''
  2 
  3 随机产生10个数字:
  4     每个数字取值范围【1-20】
  5     统计重复的数字有几个,分别是什么?
  6     统计没有重复的数字 有几个,分别是什么?   
  7 '''
  8 # 产生随机数部分:
  9 import random
 10 l = []
 11 for _ in range(10):
 12     l.append(random.randrange(21))
 13     
 14 l = [random.randrange(21) for _ in range(10)] # s使用列表解析式来生成,与for循环等价
 15     #元组没有解释器???
 16 
 17     
 18 # 比较推荐的方法:通过打标记,即类似位图一样的方法,开始 “位图表”都为0,如果重复了就变为1。
 19 # l = 11 11 7 6 6 8 11
 20 # m = 0  0  0 0 0 0 0
 21 # -------->
 22 # l = 11 11 7 6 6 8 11
 23 # m = 1  1  0 1 1 0 1
 24 # 这里注意的是,之前比过了,就标记为1,下次如7 开始后,例子中的第三个11可以不去比较,利用if判断去掉
 25 
 26 # 如果这里统计重复次数,可以看最后的改进版,如:11,因为使用第一次出现的11 开始和后面的比较,所以第二个11 下标记为1,再往后第三个11(如果有的话) 标记为3
 27 # 最后在将第一个11统计并将下面的“位图”,改为4
 28 # l = 11 11 7 6 6 8 11
 29 # m = 3  1  0 1 1 0 2
 30 
 31 
 32     
 33 # 第一步:
 34 l = [11,11,7,6,6,8,11]
 35 length = len(l) # 7
 36 m = [0] * length  
 37 
 38 for i in range(length):# 0 1,3
 39     if m[i] == 1:continue # 已经比较过的数字,在新的一轮里可以跳过,比如第2 个11
 40     flag = False # 标记表示不相等
 41     for j in range(1 + i, length):#注意这个区间     
 42         if m[i] != 0:continue  # 已经比较过的数字,在新的一轮里可以跳过,如7 开始比较,第三个11就不用比
 43         if l[i] == l[j]: #l[3] = l[4]
 44             flag = True # 比较了,并相等
 45             m[j] = 1 # 把相应的 “位图”置为1
 46     if flag: #相等,并把第一项也置为 1
 47         m[i] = 1
 48 print(m)
 49 
 50 
 51 #  第二步
 52 l = [11,11,7,6,6,8,11]
 53 length = len(l) # 7
 54 m = [0] * length 
 55 
 56 for i in range(length):# 0 1,3
 57     count = 1 # 统计出现次数,因为第一个用于比较了,所以先置为1 
 58     if m[i] == 1:continue
 59     flag = False
 60     for j in range(1 + i, length):#[1,6], [2,6] [4,6]       
 61         if m[i] != 0:continue
 62         if l[i] == l[j]: #l[3] = l[4]
 63             flag = True
 64             m[j] = 1
 65             count += 1
 66     if flag:
 67         m[i] = 1
 68         print(l[i],count)        
 69 print(m)
 70 
 71 # 第三步
 72 l = [11,11,7,6,6,8,11]
 73 length = len(l) # 7
 74 m = [0] * length 
 75 
 76 for i in range(length):# 0 1,3
 77     count = 0 # 上面的改进版,将计数加到“位图’”中
 78     if m[i] == 1:continue
 79     flag = False
 80     for j in range(1 + i, length):#[1,6], [2,6] [4,6]       
 81         if m[i] != 0:continue
 82         if l[i] == l[j]: #l[3] = l[4]
 83             flag = True
 84             count += 1
 85             m[j] = count   
 86     if flag:
 87         m[i] = count + 1
 88         
 89         print(l[i],m[i])       
 90 print(m) # [3, 1, 0, 2, 1, 0, 2]
 91 
 92 
 93 # 第四步(优化),
 94 # 因为有了count 就可以不用flag了,只要count != 0,表示没有相同的出现
 95 l = [11,11,7,5,11,7,6,11]
 96 length = len(l) # 7
 97 m = [0] * length 
 98 samenum = []
 99 diffnum = []
100 
101 for i in range(length):# 0 1,3
102     
103     if m[i] != 0:continue 
104     count = 0
105     #flag = False
106     for j in range(1 + i, length):#[1,6], [2,6] [4,6]       
107         if m[i] != 0:continue
108         if l[i] == l[j]: #l[3] = l[4]
109             #flag = True
110             count += 1
111             m[j] = count   
112     #if flag:
113     if count:
114         m[i] = count + 1
115         samenum.append((l[i], m[i]))         
116     else:
117         diffnum.append(l[i])
118 print(samenum)
119 print(diffnum)
120 
121 
122 #结果:
123 [(11, 4), (7, 2)]
124 [5, 6]

 

 1 如下这个版本也可以,但是限于统计数字比较少的情况,编程思想来自
 2 https://www.cnblogs.com/JerryZao/p/9460526.html
 3 通过一个列表的索引来判断次数
 4 
 5 
 6 import random
 7 l = []
 8 for _ in range(11):
 9     num = random.randint(1,20)
10     l.append(num)
11 #print(l) # [15, 20, 6, 8, 4, 6, 13, 15, 11, 9, 11]
12 # l = [15, 20, 6, 8, 4, 6, 13, 15, 11, 9, 11]
13 counter = [0] * 21
14 for i in l:
15     counter[i] += 1
16 # counter = [0,0,1,2,....]
17 for i in range(len(counter)):
18     if counter[i]:
19         print('the count of {} is {}'.format(i,counter[i]))

 

posted @ 2018-08-13 22:19  JerryZao  阅读(1266)  评论(0编辑  收藏  举报