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