Python集合及操作

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

集合

  • 集合:把不同元素组合在一起形成的一个数据集合
  • 集合分为两种:可变集合(set),不可变集合(frozenset)
  • 集合的内部结构和字典类似,但是不存储value,其中的元素也会进行hash运算,可以称的上是一个没有value的字典
  • 集合中数据元素不能为可变数据对象
>>> myset = {[1,2,3]}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
#可变数据对象不可hash,所以不能成为集合中数据元素

创建集合
  • 可变集合
>>> myset = {1,2,3,4,5}
#直接通过大括号创建
>>> myset = set([1,2,3,1,2,3])
>>> myset
{1, 2, 3}
#通过工厂函数接收一个可迭代对象

  • 不可变集合
>>> myset = frozenset([1,2,3,1,2,3])
>>> myset
frozenset({1, 2, 3})

访问集合
  • 迭代访问集合
>>> myset  = {1,2,3}
>>> for var in myset:
...     print(var)
...
1
2
3
#集合虽然无序,但是可以通过for循环迭代访问
更新集合
  • set.add():更新可hash数据类型到集合中,并维持数据类型

由于集合中的数据元素需要进行hash运算,可变数据类型是不可以进行hash运算的,也就不能传递进来被更新

>>> myset = {1,2}
>>> myset.add('abc') #更新字符串到集合中
>>> myset
{1, 2, 'abc'}
>>> myset.add((1,2,3)) #更新元组到集合中
>>> myset
{1, 2, 'abc', (1, 2, 3)}
>>> myset.add([1,2,3]) #更新列表到集合中报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

  • set.update():如果传入的是一个序列,将被拆分成单个元素,并且去重
>>> myset = {1,2}
>>> myset.update('abc') #更新字符串
>>> myset
{1, 2, 'b', 'c', 'a'} #字符串被拆开
>>> myset.update([1,2,3]) #更新列表
>>> myset
{1, 2, 3, 'b', 'c', 'a'} #这里列表支持更新是因为存储的数据已经不再是列表,而是列表中的每一个实际数据
>>> myset.update((3,4,5)) #更新元组
>>> myset
{1, 2, 3, 4, 'b', 5, 'c', 'a'} #元组中的每一个数据都被拿出更新到集合中,并且去重

  • 可变集合支持更新操作,不可变集合不支持更新操作
>>> myset = frozenset('abc')
>>> myset
frozenset({'a', 'b', 'c'})
>>> myset.add()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'
#不可变集合不支持add更新
>>> myset.update()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'update'
#不可变集合不支持update更新

删除集合中的元素
  • s.remove(obj):删除obj元素从集合s

该函数在删除一个不存在的数据时会引发KeyError

>>> myset = {1,2,3}
>>> myset.remove(3)
>>> myset
{1, 2}
>>> myset.remove(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 5

  • s.discard(obj) :如果obj是集合s中的元素,从集合s中删除对象obj

该函数在删除一个不存在的数据时不会报错

>>> myset = {1,2}
>>> myset.discard(1)
>>> myset
{2}
>>> myset = {1,2}
>>> myset.discard(3)
>>> myset
{1, 2}

  • del myset:删除这个集合变量
>>> myset = {1,2,3}
>>> del myset
>>> myset
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'myset' is not defined
集合类型操作符
  • innot in可以判断某个元素是否在集合中
>>> myset = {1,2}
>>> 1 in myset
True
>>> 3 in myset
False
>>> 2 not in myset
False

  • 子集和超集:
    • a < ba是否是b子集a.issubset(b)
      • a的元素b都有
    • a > ba是否是b超集a.issuperset(b)
      • 超集就代表a中的元素囊括了所有b的集合元素
>>> a = {1,2}
>>> b = {1,2,3,4}
>>> a < b
True
>>> a.issubset(b)
True

集合的交、并、补操作
  • 联合:在a集合中和b集合去重数据元素,剩下的组合到一起返回一个新的集合
    • 操作符:a | b
    • 函数:a.union(b)
>>> a = {1,2,'a','b'}
>>> b = {1,3,'a','c'}
>>> a | b
{1, 2, 3, 'c', 'b', 'a'}

  • 交集:在a集合和b集合中,共同含有的集合成员去掉重复数据,组成到一起返回一个新的集合
    • 操作符:a &b
    • 函数:a.intersection(b)
>>> a = {1,2,'a','b'}
>>> b = {1,3,'a','c'}
>>> a & b
{'a', 1}

  • 差补:在a集合中去掉所有与b集合中相同的元素,只在a中保留b中没有的集合成员
    • 操作符:a – b
    • 函数:a.difference(b)
>>> a = {1,2,'a','b'}
>>> b = {1,3,'a','c'}
>>> a - b
{2, 'b'}

  • 对称差分:找出两个集合中,只属于集合a或集合b的元素;也就是去掉共有元素后,返回一个新的集合
    • 操作符:a ^ b
    • 函数:a.symmetric_differenc(b)
>>> a = {1,2,'a','b'}
>>> b = {1,3,'a','c'}
>>> a ^ b
{2, 3, 'b', 'c'}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李恩泽的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值