2.4.1 集合基础知识

  集合是无序可变序列,使用一对大括号(作者温馨提示:这一点和字典很类似,千万不要搞混啊)作为界定符,元素之间使用逗号分隔,同一个集合内的每个元素都是唯一的,元素之间不允许重复。

  在Python中,直接将集合赋值给变量即可创建一个集合对象。

1 >>> a = {3,5}           #创建集合对象
2 >>> a
3 {3, 5}
4 >>> 
5 >>> type(a)             #查看对象类型
6 <class 'set'>
7 >>> 

  

  也可以使用set()函数将列表、元组等其他可迭代对象转换为集合,如果原来的数据中存在重复元素,则在转换为集合的时候只保留一个元素。

 

 1 >>> aset = set(range(8,14))            #创建集合对象
 2 >>> aset
 3 {8, 9, 10, 11, 12, 13}
 4 >>> 
 5 >>> bset = set([0,1,2,3,0,1,2,3,7,8])  #转换时自动去掉重复元素
 6 >>> bset
 7 {0, 1, 2, 3, 7, 8}
 8 >>> 
 9 >>> x = set()                          #创建一个空集合
10 >>> x
11 set()
12 >>> 

 

 

 

  当不再使用某个集合时,可以使用del命令删除整个集合。

  注意:集合中是能包含数字、字符串、元组等不可变类型(或者说可哈希)的数据,而不能包含列表、字典、集合等可变类型的数据。Python提供了一个内置函数hash()来计算对象的哈希值,凡是无法计算哈希值(调用hash()函数时抛出异常)的对象都不能作为集合的元素,也不能作为字典对象的“键”。

  拓展知识:字典和集合的in操作比列表快很多。相信各位读者也能有这样的体验,一个功能可以使用很多种方法实现,也可以采用不同的数据类型实现。如果仔细分析比较一下会发现,不同数据类型质监某些操作的效率相差还是很大的,在选用是应多加注意,因为不同的选择意味着不同的速度和效率。例如,由于Python字典和集合都适用hash表来存储元素,因此元素查找操作的速度非常快,这就直接决定了关键字in作用于字典和集合时比列表快的多。

 

 1 import random
 2 import time
 3 
 4 x = list(range(10000))     #生成列表
 5 y = set(range(10000))      #生成集合
 6 z = dict(zip(range(10000),range(10000)))   #生成字典
 7 
 8 r = random.randint(0,999)  #生成随机数
 9 
10 start = time.time()
11 for i in range(9999999):
12     r in x                 #测试列表中是否包含某个元素
13 print('list,time used:{}'.format(time.time() - start))
14 
15 start = time.time()
16 for i in range(9999999):
17     r in y                 #测试列表中是否包含某个元素
18 print('set,time used:{}'.format(time.time() - start))
19 
20 start = time.time()
21 for i in range(9999999):
22     r in z                 #测试列表中是否包含某个元素
23 print('dict,time used:{}'.format(time.time() - start))

 

  上面代码运行结果如下,对于成员测试运算符in,列表的效率远远不如字典和集合,差距简直太惊人了。大家修改一下上面代码中列表、字典和集合的长度就会发现,随着序列的变长,列表的速度越来越慢,而字典和集合基本上不受影响。

 

1 list,time used:162.63028526306152
2 set, time used:1.421081304550171
3 dict,time used:1.3880794048309326

 

posted @ 2018-03-12 08:44  Avention  阅读(442)  评论(0编辑  收藏  举报