zoukankan      html  css  js  c++  java
  • 2.4.3 案例精选

      作为集合的具体应用,可以使用集合快速提取序列中单一元素,即提取出序列中所有不重复元素。如果使用传统方式,需要编写下面的代码:

     1 >>> import random
     2 >>> 
     3 >>> #生成100个介于0~9999之间的随机数
     4 >>> 
     5 >>> lr = [ random.choice(range(10000)) for i in range(100) ]
     6 >>> 
     7 >>> nr = []
     8 >>> 
     9 >>> for i in lr:
    10     if i not in nr:
    11         nr.append(i)
    12 
    13         
    14 >>> 
    15 >>> len(lr)
    16 100
    17 >>> 
    18 >>> len(nr)
    19 99
    20 >>> #说有lr中有一个重复的元素

      而如果使用集合,只需要下面这么一行代码就可以了,可以参考上面的代码对结果进行验证。

    1 >>> ns = set(lr)
    2 >>> 
    3 >>> len(ns)
    4 99
    5 >>> 

      拓展知识:结合中的元素不允许重复,Python集合的内部实现为此做了大量相应的优化,判断集合中是否包含某元素时比列表速度快很多。前面已经介绍了这个内容,这里再给一个例子,下面的diamante用于返回指定范围内一定数量的不重复数字,使用集合效率明显优于使用列表。

     1 import random
     2 import time
     3 
     4 def rn1(number,start,end):
     5 
     6     '''使用列表来生成number个介于start和end之间不重复随机数'''
     7     data = []
     8     while True:
     9         element = random.randint(start,end)
    10         if element not in data:
    11             data.append(element)
    12         if len(data) == number:
    13             break
    14 
    15     return data
    16 
    17 def rn2(number,start,end):
    18     '''使用集合来生成number个介于start和end之间不重复随机数'''
    19     data = set()
    20     while True:
    21         element = random.randint(start, end)
    22         data.add(element)
    23         if len(data) == number:
    24             return data
    25 
    26     27 
    28 
    29 start = time.time()
    30 for i in range(10000):
    31     d1 = rn1(500,1,10000)
    32 
    33 print('Time used:{}'.format(time.time() - start))
    34 
    35 
    36 start = time.time()
    37 for i in range(10000):
    38     d1 = rn2(500,1,10000)
    39 
    40 print('Time used:{}'.format(time.time() - start))
    41 
    42 
    43 #Time used:42.587281465530396
    44 #Time used:12.231086492538452

      上面的代码只是为了展示Python获取不重复元素的原理,如果在项目中需要这样的功能,可以采用如下方法:random模块的sample()方法可以直接从指定序列中选取指定数量个不重复的元素。

    1 >>> import random
    2 >>> 
    3 >>> random.sample(range(10000),20)
    4 [460, 6267, 4269, 4319, 8657, 9238, 8453, 7289, 9630, 8385, 3820, 3707, 2931, 6720, 5988, 5, 5096, 4575, 6706, 2602]
    5 >>> 

      拓展知识:Python也支持集合推导式。集合推导式是什么?请看下面代码:

     1 >>> 
     2 >>> { x.strip() for x in ('   he   ','she   ','     I')}
     3 {'I', 'she', 'he'}
     4 >>> 
     5 >>> import random
     6 >>> x = { random.randint(1,500) for i in range(100) }   #生成随机数,自动去除重复元素
     7 >>> 
     8 >>> len(x)                                              #一般而言输出结果会小于100
     9 91
    10 >>> 
    11 >>> { str(x) for x in range(10) }
    12 {'0', '7', '6', '9', '8', '3', '2', '1', '5', '4'}
    13 >>> 
  • 相关阅读:
    说起创业,朋友说要有100%的把握我们再去创业,如果没有100%需要80%,你咋看?
    创业很难,有没有人愿意分享自己一些创业的点子,想法,尽量详细一点?
    开了家店但生意不好,又转不出去,一直在亏钱,怎么办?
    现在创业什么行业比较好?
    有人说,现在创业的机会已经都错过了,现在创业一切都晚了,你怎么看?
    比特币会归零吗?
    如果你中了500万,一个才华横溢的人来向你融资300万创业,你会同意吗?
    王思聪创办的熊猫直播将于3月8日正式关站,这会是直播行业的落幕吗?
    请问大家觉得做什么生意本小利润大?
    前端常见跨域解决方案(全)
  • 原文地址:https://www.cnblogs.com/avention/p/8551095.html
Copyright © 2011-2022 走看看