zoukankan      html  css  js  c++  java
  • 统计随机数中重复数出现的次数----列表的练习

      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]))
    为什么要坚持,想一想当初!
  • 相关阅读:
    day12 Python操作rabbitmq及pymsql
    day11 队列、线程、进程、协程及Python使用缓存(redis/memcache)
    day10 Python作用域 Python2.7与Python3.x的类继承的区别、异步IO、多进程,多线程简介
    day09 Python socket编程
    day08 面向对象补充及单例模式
    day07 configparser xml subprocess 面向对象
    day06 Python的一些内建变量、反射、hashlib模块、re模块、os模块、sys模块
    day05 Python多层装饰器、模块、序列化、字符串格式化、生成器和迭代器、递归、time、datetime模块、logging模块
    day04 Python一些内置函数及装饰器
    查看旧版jexus命令
  • 原文地址:https://www.cnblogs.com/JerryZao/p/9471435.html
Copyright © 2011-2022 走看看