Python 还包含了一个数据类型 —— set (集合)。集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。集合对象还支持 union(联合),intersection(交),difference(差)和 sysmmetric difference(对称差集)等数学运算。
创建集合set
大括号或 set() 函数可以用来创建集合。
set集合类需要的参数必须是迭代器类型的,如:序列、字典等,然后转换成无序不重复的元素集。由于集合是不重复的,所以可以对字符串、列表、元组进行去重操作。
创建空集合
>>> s=set()>>>s
set()>>> s1=set([]) #列表>>>s1
set()>>> s2=set(()) #元组>>>s2
set()>>> s3=set({}) #字典>>>s3
set()
注意:想要创建空集合,你必须使用 set() 而不是 {}。后者用于创建空字典,我们在后面介绍的一种数据结构。
创建非空集合
即列表,元组,字典不在是空值,举两个例子
>>> s1=set([1,2,3,4])>>>s1
{1, 2, 3, 4}>>> s3=set({‘a‘:2,‘b‘:3,‘c‘:4})>>>s3
{‘c‘, ‘a‘, ‘b‘}
注:字典转set集合,需要注意的是,只取了字典的key,相当于将字典中的dict.keys()列表转成set集合。
集合的操作
集合添加
集合的添加有两种方式,分别是add和update。但是它们在添加元素时是由区别的:
add()方法
把要传入的元素作为一个整体添加到集合中,如:
>>> s=set(‘one‘)>>>s
{‘e‘, ‘o‘, ‘n‘}>>> s.add(‘two‘)>>>s
{‘e‘, ‘two‘, ‘o‘, ‘n‘}
update()方法
是把要传入的元素拆分成单个字符,存于集合中,并去掉重复的字符。可以一次添加多个值,如:
>>> s=set(‘one‘)>>>s
{‘e‘, ‘o‘, ‘n‘}>>> s.update(‘two‘)>>>s
{‘e‘, ‘n‘, ‘t‘, ‘w‘, ‘o‘}
python开发IT技术交流群:887934385 分享源码,相关教程
集合删除
集合的删除操作使用的方法跟列表是一样的,使用的也是remove方法。如:
setVar.remove(element)
setVar :为一个set类型的变量
element :表示要查找并删除的元素
函数作用:
在集合setVar中查找element元素,如果存在则删除;如果没找到,则报错。
>>> s=set(‘one‘)>>>s
{‘e‘, ‘o‘, ‘n‘}>>> s.remove(‘e‘)>>>s
{‘n‘, ‘o‘}
setVar.discard(element)
setVar :为一个set类型的变量 element :表示要查找并删除的元素
函数作用:
在集合setVar中查找element元素,如果存在则删除;如果没找到,则什么也不做。
>>>sList
set([1, 2, 3, 4, 5])>>> sList.discard(1)>>>sList
set([2, 3, 4, 5])
s.pop()
s:为set类型的变量
函数作用:
删除并返回set类型的s中的一个不确定的元素,如果为空引发KeyError错误。
>>>sList
set([2, 3, 4, 5])>>>sList.pop()2
s.clear()
s:set类型的变量
函数作用:
清空s集合中的所有元素
>>>sList
set([3, 4, 5])>>>sList.clear()>>>sList
set([])
集合的遍历
集合的遍历跟序列的遍历方法完全一样
>> s=set(‘one‘)>>>s
{‘e‘, ‘o‘, ‘n‘}>>> for i ins:print(i)
... ...
e
o
n>>>
另一种遍历方式:
>>> s=set(‘one‘)>>>s
{‘e‘, ‘o‘, ‘n‘}>>> for idex,i inenumerate(s):print(idex,i)
... ...
0 e1o2n>>>
变量idex表示集合中元素i的索引。
集合其他方法
函数说明
len(s)
set 的长度
x in s
测试 x 是否是 s 的成员
x not in s
测试 x 是否不是 s 的成员
s.issubset(t)
测试是否 s 中的每一个元素都在 t 中
s.issuperset(t)
测试是否 t 中的每一个元素都在 s 中
s.union(t)
返回一个新的 set 包含 s 和 t 中的每一个元素
s.intersection(t)
返回一个新的 set 包含 s 和 t 中的公共元素
s.difference(t)
返回一个新的 set 包含 s 中有但是 t 中没有的元素
s.symmetric_difference(t)
返回一个新的 set 包含 s 和 t 中不重复的元素
s.copy()
返回 set “s”的一个浅复制
集合的一些操作符
既然是集合,那就会遵循集合的一些操作方法,如求交集、并集、差集等。
交集 ###
Python中求集合的交集使用的符号是“&”,返回连个集合的共同元素的集合,即集合的交集。
>>> st1 = set(‘python‘)>>>st1
set([‘h‘, ‘o‘, ‘n‘, ‘p‘, ‘t‘, ‘y‘])>>> st2 = set(‘htc‘)>>>st2
set([‘h‘, ‘c‘, ‘t‘])>>> st1 &st2
set([‘h‘, ‘t‘])
并集(合集) ###
Python中求集合的并集用的是符号“|”,返回的是两个集合所有的并去掉重复的元素的集合。
>>>st1
set([‘h‘, ‘o‘, ‘n‘, ‘p‘, ‘t‘, ‘y‘])>>> st3 = set(‘two‘)>>>st3
set([‘o‘, ‘t‘, ‘w‘])>>> st1 |st3
set([‘p‘, ‘t‘, ‘w‘, ‘y‘, ‘h‘, ‘o‘, ‘n‘])
差集
Python中差集使用的符号是减号“-”。
>>>st1
set([‘1‘, ‘3‘, ‘2‘, ‘5‘, ‘4‘, ‘7‘, ‘6‘])>>> st2 = set(‘4589‘)>>>st2
set([‘9‘, ‘8‘, ‘5‘, ‘4‘])>>> st1 -st2
set([‘1‘, ‘3‘, ‘2‘, ‘7‘, ‘6‘])
返回的结果是在集合st1中但不在集合st2中的元素的集合。
集合的不同
查看两个集合的不同之处,使用的difference函数,等价于差集。如:
s1.difference(s3)
这种不同指的是集合s3相对于集合s1,不同的地方,也就是所有在集合s1中,而不再集合s2中的的元素组成的新集合。
>>>s1
set([1, 2, 3, 4, 5])>>>s2
set([1, 2, 3, 4])>>>s1.difference(s2)
set([5])>>>s3
set([‘1‘, ‘8‘, ‘9‘, ‘5‘])>>>s1.difference(s3)
set([1, 2, 3, 4, 5])
集合的范围判断
集合可以使用大于(>)、小于(=)、小于等于(<=)、等于(==)、不等于(!=)来判断某个集合是否完全包含于另一个集合,也可以使用子父集判断函数。
定义三个集合s1,s2,s3:
>>> s1=set([1, 2, 3, 4, 5])>>> s2=set([1, 2, 3, 4])>>> s3=set([‘1‘, ‘8‘, ‘9‘, ‘5‘])
大于(>)或大于等于(>=)
>>> s1 >s2
True>>> s1 >s3
False>>> s1 >=s2
True
表示左边集合是否完全包含右边集合,如集合s1是否完全包含集合s2。
小于(
>>> s2
True>>> s1
False>>> s3
False
表示左边的集合是否完全包含于右边的集合,如集合s1是否完全包含于集合s2。
等于(==)、不等于(!=)
>>> s1 ==s2
False>>> s2 ==s3
False>>> s1 !=s2
True
判断两个集合是否完全相同。
不可变集合frozenset
Python中还有一种不可改变的集合,那就是frozenset,不像set集合,可以增加删除集合中的元素,该集合中的内容是不可改变的,类似于字符串、元组。
>>> f =frozenset()>>>f
frozenset([])>>> f = frozenset(‘asdf‘)>>>f
frozenset([‘a‘, ‘s‘, ‘d‘, ‘f‘])>>> f = frozenset([1,2,3,4])>>>f
frozenset([1, 2, 3, 4])>>> f = frozenset((1,2,3,4))>>>f
frozenset([1, 2, 3, 4])>>> f = frozenset({1:2, ‘a‘:2, ‘c‘:3})>>>f
frozenset([‘a‘, 1, ‘c‘])
如果试图改变不可变集合中的元素,就会报AttributeError错误。
不可变集合,除了内容不能更改外,其他功能及操作跟可变集合set一样。