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
posted @ 2022-03-04 15:00  hook_what  阅读(60)  评论(0编辑  收藏  举报