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 >>> 

 

posted @ 2018-03-12 21:07  Avention  阅读(543)  评论(0编辑  收藏  举报