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