集合有两种类型的,分为可变集合(set)和不可变集合(frozenset)
- 可变集合(set)可以添加和删除元素,不可变集合(frozenset)不允许添加和删除元素
- 可变集合(set)是不可哈希,因此不能用作字典的键也不能作为其他集合中的元素,而不可变集合(frozenset)可以
- 支持用 in 和not in 来检查成员,len()来得到集合的基数大小,用for循环迭代集合的成员
- 由于集合本身是无序的,不支持为集合创建索引和执行切片操作
集合的创建方法,分别由集合的工厂方法set()和frozenset()
>>>s = set ('bookshop')
>>> s {'b', 'h', 'p', 'o', 'k', 's'}
>>>t = frozenset('cheseshop')
>>> t frozenset({'c', 'h', 'p', 'o', 'e', 's'})
>>> type(s)
<class 'set'>
>>> type(t)
<class 'frozenset'>
访问集合中的值
- for循环迭代集合元素
>>> for i in s:
print(i + ' ',end = ' ')
b h p o k s
>>> for i in t:
print(i + ' ',end = ' ')
c h p o e s
更新集合,只能针对可变集合,不能运用到不可变集合
- 通过set.add()方法添加元素
>>> s.add('aa')
>>> s
{'aa', 'b', 'h', 'p', 'o', 'k', 's'}
- 通过update()方法更新集合元素
>>> s.update('cc')
>>> s
{'aa', 'c', 'b', 'h', 'p', 'o', 'k', 's'}
- 通过set.remove()方法删除集合中的元素
>>> s.remove('aa')
>>> s
{'c', 'b', 'h', 'p', 'o', 'k', 's'}
- 通过-=上一个集合,实现删除集合元素
>>> s -= set('cc')
>>> s
{'b', 'h', 'p', 'o', 'k', 's'}
- add()和update()方法的区别在于,add()方法将参数作为集合的一个元素完整加入集合中,而update()方法是将参数作为一个集合,相当于两个集合的合集,然后去掉重复的
- remove()和-=的区别在于,remove()方法将参数作为集合的一个元素从集合中删除,而-=是在原集合中删除-=后的集合中的元素
删除集合
- 通过del命令
>>> ss = set('abc')
>>> del ss
>>> ss
Traceback (most recent call last):
File "<pyshell#30>", line 1, in <module>
ss
NameError: name 'ss' is not defined
集合操作类型符
标准操作类型符(适用于可变集合、不可变集合)
- 成员关系:通过 in 和not in判断
>>> 'k' in s
True
>>> 'ss' in s
False
>>> 'c' in t
True
>>> 'k' in t
False
>>> 'ss' not in s
True
>>> 'c' not in t
False
- 集合等价/不等价:
集合等价指的是当且仅当其中一个集合中的每一个成员同时也是另一个集合中的成员。 也可以说每一个集合必须是另一个集合的子集,及s<=t和s>=t的值均为真(True)或(s<=t and s>=t 的值为真(True))。 集合的等价/不等价与集合的类型或者集合的成员的顺序无关,只与集合的元素有关。
>>> s<=t
False
>>> s>=t
False
>>> u = frozenset(s)
>>> s == u
True
>>> s<=u
True
>>> set('abcd') == set('dcba')
True
- 子集/超集:提供比较操作符来检查一盒集合是否是另一个集合的子集/超集
>>> set('shop') < set('bookshop')
True
>>> set('bookshop')>=set('shop')
True
“小于”符号(<,<=)用来判断子集,其中(<)表示严格子集,(<=)非严格子集
“大于”符号(>,>=)用来判断超集,其中(>)表示严格超集,(>=)非严格超集
集合类型操作符(适用于可变集合、不可变集合)
- 联合(|)
联合(union)操作和集合的OR是等价的。两个集合联合成一个新的集合该集合中的元素至少是其中的一个集合的元素,即,属于两个集合其中之一的元素 联合(|)还有一个等价方法:union()
>>> s|t
{'c', 'b', 'h', 'p', 'o', 'k', 'e', 's'}
>>> s.union(t)
{'c', 'b', 'h', 'p', 'o', 'k', 'e', 's'}
- 交集(&)
两个集合的交集是一个新的集合,该集合中的每一个元素都是两个集合中的成员,即属于两个集合的成员,等价方法:intersection()
>>> s&t
{'h', 'o', 'p', 's'}
>>> s.intersection(t)
{'h', 'o', 'p', 's'}
- 差补/相对补集(-)
两个集合(s-t)的差补或者相对补集是指一个集合,该集合中的元素只属于集合s,而不属于集合t,等价方法是:difference()
>>> s-t
{'b', 'k'}
>>> s.difference(t)
{'b', 'k'}
- 对称差分(^)
两个集合(s-t)的对称差分是指一个集合,该集合中的元素只属于集合s,或者只属于集合t,不能同时属于两个集合 等价方法:symmetric_difference()
>>> s^t
{'c', 'b', 'k', 'e'}
>>> s.symmetric_difference(t)
{'c', 'b', 'k', 'e'}
- 混合结合类型操作
如果左右两个操作数的类型相同,既都是可变集合或者不可变集合,则产生的结果类型是相同的, 但是如果左右两个操作数的类型不相同,则产生的结果类型和左操作数类型相同
>>> type(s&t)
<class 'set'>
>>> type(t&s)
<class 'frozenset'>
集合类型操作符(适用于可变集合),后面跟的是set()方法生成的新的集合
- |=:从已存在的集合中添加多个元素,等价于update()方法
>>> s
{'b', 'h', 'p', 'o', 'k', 's'}
>>> s |= set('hji')
>>> s
{'i', 'b', 'h', 'j', 'p', 'o', 'k', 's'}
>>> s.update('hji')
>>> s
{'i', 'b', 'h', 'j', 'p', 'o', 'k', 's'}
- &=:保留(或则交集更新)操作保留与其他集合共有成员,等价于:intersection_update()
>>> s
{'i', 'b', 'h', 'j', 'p', 'o', 'k', 's'}
>>> s &= set('bookshop')
>>> s
{'b', 'h', 'p', 'o', 'k', 's'}
>>> s.intersection_update('shop')
>>> s
{'h', 'o', 'p', 's'}
- -=:对集合s 和t 进行差更新操作,差更新操作返回一个集合,该集合中的元素是集合 s 去除掉集合 t 中的元素后剩余的元素,等价方法:difference_update()
>>> s
{'i', 'b', 'h', 'j', 'p', 'o', 'k', 's'}
>>> s -= set('hji')
>>> s
{'b', 'p', 'o', 'k', 's'}
>>> s.difference_update('book')
>>> s
{'p', 's'}
- ^=:对集合s 和t 进行对称差更新操作,对称差更新操作返回一个集合,该集合中的元素是仅是原集合 s 或者仅是原集合 t 中的元素,等价方法:symmetric_difference_update()
>>> s
{'b', 'h', 'p', 'o', 'k', 's'}
>>> s ^= set('bookpage')
>>> s
{'a', 'g', 'h', 'e', 's'}
>>> s.symmetric_difference_update('shop')
>>> s
{'a', 'g', 'p', 'o', 'e'}
内建函数
方法(适用于所有集合的方法)
- s.issubset(t):如果s是t的子集,则返回True,否则返回False
>>> s.issubset(t)
False
>>> ss = set('agp')
>>> ss.issubset(s)
True
- s.issuperset(t):如果t是s的超集,则返回True,否则返回False
>>> s.issuperset(t)
False
>>> ss.issuperset(s)
False
>>> s.issuperset(ss)
True
- s.copy():返回一个新的集合,是集合s的浅复制
>>> s
{'a', 'g', 'p', 'o', 'e'}
>>> s.copy()
{'a', 'g', 'p', 'o', 'e'}
>>> sss = s.copy()
>>> sss
{'a', 'g', 'p', 'o', 'e'}
方法(适用于可变集合的方法)
- s.discard(obj):如果obj是集合s中的元素,从集合s中删除对象obj
>>> s = set('bookshop')
>>> s
{'o', 's', 'k', 'p', 'b', 'h'}
>>> s.discard('s')
>>> s
{'o', 'k', 'p', 'b', 'h'}
- s.pop():删除集合s中的任意一个元素,并返回它
>>> s {'o', 'k', 'p', 'b', 'h'}
>>> s.pop()
'o'
- s.clear():删除集合s中的所有元素
>>> s {'o', 'k', 'p', 'b', 'h'}
>>> s.clear()
>>> s
set()