Python基础学习笔记(十一)——集合

目录

一、集合的介绍与创建

  集合 (set),一种可变、无序、不重复 的数据结构,由大括号{}内、用逗号分隔的一组元素组成。

  集合的元素是可变 的,即,它支持元素的引用的直接修改,并有相应的操作函数。

  与同为组合的序列不同,集合的元素是无序 的。这意味着元素的顺序与其添加的顺序无关,并且元素也不再支持索引访问 。

  集合的访问 仅可通过组合的通用操作 进行,如:for循环遍历、成员运算 。(见第三篇和第七篇)

  集合的元素是不重复 的,也就是说,集合可自动对内部的元素进行去重处理。

  与序列同理,集合同样有赋值创建 和引用创建 ,对应类似的函数set()。此外,类似于列表生成式(见第六篇),还支持集合生成(推导)式。

python 复制代码
# 直接创建
set_ = {1, 2, 3}
print(set_)   # {1, 2, 3}

# 引用创建
set_ = set([1, 2, 3])
print(set_)   # {1, 2, 3}

# 空集
set_ = set()
print(set_)     # set()

# 集合生成式
set_ = {i**2 for i in range(10) if i%2 == 0}
print(set_)     # {0, 64, 4, 36, 16}

二、集合的存储原理

  集合通过哈希表 来实现存储,即使用散列函数 将元素映射到表中的位置。

  元素的地址 会通过哈希函数 计算得到一个定长数字,该数字称为哈希值 或散列值 。而哈希表 是一种根据键的哈希值直接访问存储位置的数据结构,也称为散列表。

  不同元素的哈希值可能相同,这就是哈希冲突。当发生冲突时,系统将元素添加到哈希桶的尾部,使其成为链表的节点。

  集合的元素不会重复,是因为哈希表的结构会使得相同元素的会映射到同一地址。

三、元素的修改

1. 添加元素

  • add(element):添加一个元素。
  • update(iterable):添加一个组合内的元素。
python 复制代码
set_ = set()

# 单个添加
set_.add('num')
print(set_)     # {'num'}

# 多个添加
set_.update(range(5))
print(set_)     # {0, 1, 2, 3, 4, 'num'}

2. 删除元素

  • discard(element):删除一个指定元素
  • remove(element):删除一个指定 元素(见第六篇)
  • pop():删除一个任意 元素(见第六篇)
  • clear():清空元素 (见第六篇)

  后三个函数同样适用于列表的元素删除,语法格式与集合相似,但缺失索引后,其功能范围有所变化。

  其中,pop()的 "任意" 是与哈希值有关的伪随机机制。

python 复制代码
set_ = set(range(5))   # {0, 1, 2, 3, 4}

# 定向删除
set_.discard(0)
print(set_)     # {1, 2, 3, 4}
set_.remove(1)
print(set_)     # {2, 3, 4}

# 不定向删除
set_.pop()
print(set_)     # {3, 4}

# 清空
set_.clear()
print(set_)     # set()

四、集合的运算

  • set1.intersection(set2):交 运算,对应运算符&,即set1 & set2
  • set1.union(set2):并 运算,对应运算符|,即set1 | set2
  • set1.difference(set2):差 运算,对应运算符-,即set1 - set2
  • set1.symmetric_difference(set2):对称差运算

  其中,并运算可用于元素的添加,区别在于:集合的运算返回的是一个新的集合。

python 复制代码
set1 = {'c', 'a', 't'}
set2 = {'h', 'a', 't'}

# 取交
print(set1.intersection(set2))          # {'t', 'a'}
print(set1 & set2)

# 取并
print(set1.union(set2))                 # {'t', 'c', 'h', 'a'}
print(set1 | set2)

# 取差:从 set1 中去掉 set1&set2 的元素
print(set1.difference(set2))            # {'c'}
print(set1 - set2)

# 对称取差:从 set1|set2 中去掉 set1&set2 的元素
print(set1.symmetric_difference(set2))  # {'c', 'h'}
print((set1 | set2) - (set1 & set2))

# 地址更改
print(id(set1))                 # 2357217208448
print(id(set2))                 # 2357217209344
print(id(set1.union(set2)))     # 2357217208672

五、集合的判定

  • set1.isdisjoint(set2):判断两集是否存在相同元素
  • set1.issubset(set2):判断set1是否为set2的子集
  • set1.issuperset(set2):判断set1是否为set2的超集

  以上函数的返回值类型为布尔。

python 复制代码
set1 = set('apple')
set2 = set('app')

# 无共同元素为真
print(set1.isdisjoint(set2))    # False
# set2 Ↄ set1 为真
print(set1.issubset(set2))      # False
# set1 Ↄ set2 为真
print(set1.issuperset(set2))    # True
相关推荐
天疆说2 分钟前
DeepSeek 开源学习中心公开课调研笔记
笔记·学习·开源
“AI国潮设计-小江”6 分钟前
《【AIGC实战】Python+SDXL批量生成“英歌舞草莓抱抱卷蛋糕”IP插牌立牌方案,锁定角色一致性,甜品插件化落地》
开发语言·人工智能·python·prompt·aigc
LMT流氓兔6 分钟前
第五单元——第7课:工具读取用户身份,而不是让模型填写身份
python·langchain
FlyWIHTSKY9 分钟前
Agent阶段一:基础夯实
python·ai·fastapi
估值探索者10 分钟前
【Python量化技术指标实战 04】布林带通道突破,怎么知道是真突破还是假突破?
java·开发语言·python·接口·股票数据api接口
fanruitian22 分钟前
python property
开发语言·python
Web3&Basketball27 分钟前
MiniMax M3.1 Flash实战:3个成本坑
python·大模型·成本优化·minimax·推理优化·token计费
Angeldream12331 分钟前
第 7 章 医学影像特征提取与分析
图像处理·python·深度学习·计算机视觉·医学影像·特征提取
艾莉丝努力练剑40 分钟前
【AI大模型接入SDK】ChatServer 路由规则绑定
网络·c++·人工智能·学习·ai·架构
无语的小歪歪1 小时前
ATF 智测 1.0
python·测试工具·集成测试