Python容器篇 5 -- 集合

集合

set = {item1, item2, ...}

创建一个空集合:

  1. em_set = set() # 只有这一种方式, {}已经被用作创建空字典!

集合这种容器, 貌似是5大容器中最没有存在感, 也确实是用的最少的一种;
但是, 它的作用却很重要!

集合和字典一样, 都属于无序的数据类型!

集合的特点 (重要)

  • 集合中不存在重复的元素
  • 那么, 集合的其中一个很重要的作用就是去重了!

可变和不可变特性

  • 集合本身是可变的, 也就是说集合中的元素可以被删除, 同时也可以往集合中添加新的元素
  • 但是集合中的元素必须是不可变的, 也就是集合中的元素不能是列表和字典以及特殊的元组
  • 至于修改元素, 这个功能对于集合来说不太适用, 因为集合中的元素既没有下标, 也没有像是字典那样的元素唯一标识(key), 也正是因为如此, 集合才会强制要求其中的元素是不可变的

解释一下什么叫特殊的元组, 元组本身不可变对吧, 看似很符合作为集合中元素的条件;
但是如果元组中有一个列表呢? 比如: my_set = {1, 2, "hello", (3, 4, [5, 6])}
这种情况下, 虽然(3, 4, [5, 6])本身不可变, 但是[5, 6]这个列表是能变的, 比如变成[7, 8];
所以定义这样的非法集合是会报错的!

集合的添加

  1. set.add()
  2. set.update()
    • update这个方法的参数可以是可变对象, 它会把可变对象中的不可变元素提取出来
    • update添加的元素一定是最原子性的不可变对象 (拆到不能再拆)

集合的删除

  1. set.remove()
    • 元素不存在, 直接报错
  2. set.discard()
    • 元素不存在, 不会报错
  3. set.pop()
    • 随机删除一个元素, 并把它返回出来

集合的大小

  • len(set)

清空集合

  • set.clear()

是否存在某个元素

  • item in/not in set

集合不需要也不能单独查某个元素
集合不需要count函数去统计出现次数因为集合中的元素只能出现1次

集合推导式

aset = {x for x in 可迭代对象 if 条件}

集合的常用方法

  1. 减法算数运算 (集合独占)

相当于求补集

aset = {1, 2, 3, 4, 5, 6}
bset = {2, 4, 6}
cset = aset - bset
print(cset)

结果

{1, 3, 5}
  1. 集合运算 (类似于数学中集合的运算)
  • 取并集 | (包含于集合a的所有元素 + 包含于集合b的所有元素)
aset = {1, 2, 3}
bset = {4, 5, 6}
cset = aset | bset
print(cset)

结果

{1, 2, 3, 4, 5, 6}
  • 取交集 & (包含于集合a, 且同时包含于集合b)
aset = {1, 2, 3, 4, 5}
bset = {1, 2}
cset = aset & bset
print(cset)

结果

{1, 2}
  • 补集的并集 ^ (不同时包含于集合a和集合b的元素)

首先理解一下补集是啥?

补集 --> 补充用的集合
谁对谁补充, 需要2个对象!
比如:

  • A对B的补集, 就是B里没有但是A里有的元素组成的补充集合, 用A去补充B所需要的A中的部分元素
  • B对A的补集, 就是A里没有但是B里有的元素组成的补充集合, 用B去补充A所需要的B中的部分元素

那么, 补集的并集就是 A对B的补充加上B对A的补充, 注意仅是补充的部分!

aset = {1, 2, 3, 4, 5}
bset = {2, 4, 6, 8, 10}
cset = aset ^ bset
print(cset)

结果

{1, 3, 5, 6, 8, 10}
# A对B的补集 {1, 3, 5}
# B对A的补集{6, 8, 10}
posted @ 2020-10-16 22:51  sn0wp3ak  阅读(174)  评论(0编辑  收藏  举报