Python巩固基础02-基本数据类型之Set集合类型详解
集合的去重功能
创建集合时自动去重
>>> a = {'hello', 'hello', 'a', 'world', 'mike'}
>>> a
{'world', 'hello', 'mike', 'a'}
# set()方法创建集合时,传参为序列
>>> b = set(('hello', 'hello', 'a', 'world', 'mike'))
>>> b
{'world', 'hello', 'mike', 'a'}
对其他序列进行去重
就相当于使用set方法创建集合
>>> x = ['hello', 'hello', 'a', 'world', 'mike']
>>> list(set(x))
['world', 'hello', 'mike', 'a']
>>> ''.join(set('hello'))
'eloh'
集合的推导式
>>> s = {i for i in 'hello'}
>>> s
{'e', 'l', 'o', 'h'}
# 注意:当推导式中为键值对时,即是字典推导式
>>> d = {i:j for i in 'hello' for j in 'world'}
>>> d
{'h': 'd', 'e': 'd', 'l': 'd', 'o': 'd'}
集合元素的操作
给集合添加元素
set.add()
方法,参数只能为一个元素,不能为序列;当参数在集合中不存在时则添加,存在时则不进行任何操作
>>> s = {'world', 'hello', 'mike', 'a'}
>>> s.add('kangkang')
>>> s.add(1)
>>> s.add('hello')
>>> s
{1, 'a', 'world', 'mike', 'kangkang', 'hello'}
set.update()
方法,参数需要为一个或多个可迭代序列;当参数在集合中不存在时则添加,存在时则不进行任何操作
>>> s.update(2)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'int' object is not iterable
>>> s.update((2,))
# 当update方法的参数为一个字符串时,会迭代字符串,将每个字符添加进集合中
>>> s.update('hello')
>>> s
{1, 2, 'a', 'world', 'mike', 'kangkang', 'e', 'o', 'hello', 'l', 'h'}
# 当update方法参数为字典时,会添加key到集合中
>>> s.update({'name': 'mike', 'age': 12})
>>> s
{1, 2, 'a', 'world', 'mike', 'kangkang', 'e', 'age', 'o', 'hello', 'l', 'name', 'h'}
删除集合中的元素
set.remove()
参数为元素,删除此元素,若此元素不在集合中,会报错
>>> s
{'hello', 'mike', 'kangkang', 'world', 'mary'}
>>> s.remove('kangkang')
>>> s
{'hello', 'mike', 'world', 'mary'}
>>> s.remove('jane')
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
s.remove('jane')
KeyError: 'jane'
set.discard()
参数为元素,删除此元素,若此元素不在集合中,不进行任何操作,不报错
>>> s.discard('mike')
>>> s
{'hello', 'world', 'mary'}
>>> s.discard('jane')
set.pop()
随机删除集合中的元素并返回此元素,若集合为空,会报错
>>> s.pop()
'hello'
>>> s.pop()
'world'
set.clear()
清空集合中所有元素, del set
删除集合本身
>>> s
{'hello', 'mike', 'kangkang', 'world', 'mary'}
>>> s.clear()
>>> s
set()
>>> del s
>>> s
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
s
NameError: name 's' is not defined
打印集合中的元素
集合是无序的,因此不能使用索引查找元素,可以通过循环遍历打印集合中的值
>>> for i in s:
... print(i)
...
hello
mike
kangkang
world
mary
集合间的运算
两个集合的交集
- 交集:即两个集合相交元素(两个集合共同拥有的元素,a有且b也有)的集合;
- 使用运算符
&
,返回一个新的集合; - 使用
set.intersection()
方法,返回一个新的集合; - 使用
set.intersection_update()
方法,在原集合的基础上剔除不重合的元素,将原集合更新为这两个集合的交集,返回None;
>>> a = {'thank', 'you', 'mike', 'please', 'help', 'me'}
>>> b = {'no', 'thank', 'it', 'is', 'me'}
>>> a & b
{'thank', 'me'}
>>> a.intersection(b)
{'thank', 'me'}
# intersection()参数可以为空,则返回集合的所有元素
>>> a.intersection()
{'thank', 'please', 'you', 'mike', 'me', 'help'}
>>> a
{'please', 'you', 'mike', 'help', 'thank', 'me'}
>>> b
{'is', 'it', 'thank', 'no', 'me'}
>>> a.intersection_update(b)
>>> a
{'thank', 'me'}
>>> b
{'is', 'it', 'thank', 'no', 'me'}
两个集合的并集
- 并集:即两个集合元素相加(集合a包含或集合b包含的元素)的集合;
- 使用运算符
|
或者set.union()
方法,返回一个新的集合;
>>> a = {'thank', 'you', 'mike', 'please', 'help', 'me'}
>>> b = {'no', 'thank', 'it', 'is', 'me'}
>>> a | b
{'please', 'you', 'mike', 'is', 'it', 'help', 'thank', 'no', 'me'}
# union()参数可以为空,则返回集合的所有元素
>>> a.union(b)
{'please', 'you', 'mike', 'is', 'it', 'help', 'thank', 'no', 'me'}
注意:因为是两个集合元素加起来组成的新集合,所以会进行去重。
两个集合的差集
- 差集:即两个集合元素相减的集合,例如a与b的差集,为a有但b没有的元素集合,若a和b有重复元素,会减去这一部分元素;
- 使用运算符
-
或者set.difference()
方法,返回一个新的集合; - 使用
set.difference_update()
方法,在原集合的基础上减去与另一个集合重复的元素,修改原集合,返回None;
>>> a
{'please', 'you', 'mike', 'help', 'thank', 'me'}
>>> b
{'is', 'it', 'thank', 'no', 'me'}
>>> a - b
{'please', 'you', 'mike', 'help'}
>>> a
{'please', 'you', 'mike', 'help', 'thank', 'me'}
# difference()参数可以为空,则返回集合的所有元素
>>> a.difference(b)
{'please', 'you', 'mike', 'help'}
>>> a
{'please', 'you', 'mike', 'help', 'thank', 'me'}
>>> a.difference_update(b)
>>> a
{'please', 'you', 'mike', 'help'}
两个集合的对称集
- 对称集:即两个集合所有的元素减去重复元素的集合,相当于两个集合的并集-两个集合的交集;
- 使用运算符
^
或者set.symmetric_difference()
方法,返回一个新的集合; - 使用
set.symmetric_difference_update()
方法,在原集合的基础上更新元素,返回None;
>>> a = {'thank', 'you', 'mike', 'please', 'help', 'me'}
>>> b = {'no', 'thank', 'it', 'is', 'me'}
>>> a ^ b
{'please', 'mike', 'help', 'you', 'is', 'it', 'no'}
>>> a
{'please', 'you', 'mike', 'help', 'thank', 'me'}
>>> a.symmetric_difference(b)
{'please', 'mike', 'help', 'you', 'is', 'it', 'no'}
>>> a
{'please', 'you', 'mike', 'help', 'thank', 'me'}
>>> a.symmetric_difference_update(b)
>>> a
{'please', 'you', 'mike', 'is', 'it', 'help', 'no'}
判断集合间的关系
判断两个集合是否不相交,set.isdisjoint()
方法,不相交则返回True,相交则返回False
>>> a = {'thank', 'you', 'mike', 'please', 'help', 'me'}
>>> b = {'no', 'thank', 'it', 'is', 'me'}
>>> c = {'happy', 'new', 'year'}
>>> a.isdisjoint(b)
False
>>> a.isdisjoint(c)
True
判断一个集合是否为另一个集合的子集,set.issubset()
方法,是则返回True,不是则返回False
>>> a = {'thank', 'you', 'mike', 'please', 'help', 'me'}
>>> d = {'thank', 'you'}
>>> a.issubset(b)
False
>>> d.issubset(a)
True
判断一个集合是否为另一个集合的父集,set.issuperset()
方法,是则返回True,不是则返回False
>>> a = {'thank', 'you', 'mike', 'please', 'help', 'me'}
>>> d = {'thank', 'you'}
>>> a.issuperset(d)
True
>>> d.issuperset(a)
False