从0开始转入Ai应用层,从python学起第六天
·
一、集合 (Set) 核心定义
集合是一个无序、不重复的元素序列。元素之间用逗号分隔,用 {} 或 set() 函数创建。
核心特性:
- 自动去重(重复元素只保留一个)
- 元素必须是不可变类型(不能放列表、字典)
- 无序(不支持索引访问)
- 可进行交集、并集、差集等集合运算
重要提醒:空集合必须用 set(),因为 {} 是用来创建空字典的。
二、集合的创建方式
1. 直接使用 {} 定义(最常用)
set1 = {1, 2, 3, 4} # 自动去重
name = {'牛奶', '面包', '鸡蛋', '牛奶'} # 重复元素被去掉
print(name) # {'苹果', '牛奶', '鸡蛋', '面包'}
2. 使用 set() 函数(将可迭代对象转为集合)
set2 = set([4, 5, 6, 7]) # 从列表创建
set3 = set((4, 5, 6, 7)) # 从元组创建
name = set() # 创建空集合(必须用set())
3. 推导式创建(了解即可)
类似列表推导式,根据条件快速生成集合。
4. 不可变集合 (frozenset)
用于需要“不能修改的集合”的场景(如作为字典的键):
fs = frozenset([1, 2, 3, 4])
d = {fs: "这是不可变集合作为键"}
创建方式总结
| 方式 | 语法 | 适用场景 |
|---|---|---|
{} 直接定义 |
{1, 2, 3} |
手动定义少量元素 |
set() 函数 |
set([1,2,3]) |
将列表/元组/字符串等转为集合 |
set() 空集合 |
set() |
创建空集合(不能用 {}) |
| 推导式 | {x for x in ...} |
按规则生成集合 |
frozenset() |
frozenset([1,2]) |
创建不可修改的集合 |
三、集合的基本操作(增、删、查、集合运算)
1. 增加元素
| 方法 | 作用 | 示例 |
|---|---|---|
add(elem) |
添加单个元素 | s.add('苹果') |
update(iterable) |
批量添加可迭代对象中的元素 | s.update(['苹果','香蕉']) |
first_set = set()
first_set.add('苹果') # 添加单个元素
first_set.update(['苹果', '香蕉']) # 批量添加
2. 删除元素
| 方法 | 作用 | 元素不存在时 |
|---|---|---|
remove(elem) |
删除指定元素 | 报错 (KeyError) |
discard(elem) |
删除指定元素 | 不报错(推荐) |
pop() |
随机删除并返回一个元素 | 集合为空时报错 |
clear() |
清空所有元素,保留空集合 | — |
name = {1, 2, 3, 4, 5}
name.remove(3) # 删除3,不存在会报错
name.discard(10) # 删除10,不存在也不报错(更安全)
name.pop() # 随机删除一个元素
name.clear() # 清空集合
3. 查询元素(无索引,只能判断存在或遍历)
name = {1, 2, 3, 4, 5}
# 判断元素是否存在
print(1 in name) # True
print(10 not in name) # True
# 遍历集合(注意:无序)
for i in name:
print(i)
# 获取集合长度
print(len(name)) # 5
# 判断集合是否为空
print(not name) # False(非空返回True,空集合返回False)
4. 集合间运算
集合最强大的功能是数学集合运算,有两种等价写法:运算符 和 方法。
| 运算类型 | 运算符 | 方法 | 说明 |
|---|---|---|---|
| 并集 | | |
union() |
a和b的所有元素(去重) |
| 交集 | & |
intersection() |
a和b都有的元素 |
| 差集 | - |
difference() |
a有但b没有的元素 |
| 对称差集 | ^ |
symmetric_difference() |
a和b中互不相同的元素 |
a = {1, 2, 3}
b = {2, 3, 4}
print(a | b) # {1, 2, 3, 4} 并集
print(a & b) # {2, 3} 交集
print(a - b) # {1} 差集(a有b没有)
print(a ^ b) # {1, 4} 对称差集
5. 子集与交集判断
| 方法 | 作用 | 示例 |
|---|---|---|
issubset() |
判断是否为子集 | b.issubset(a) → b是a的子集? |
issuperset() |
判断是否为父集 | a.issuperset(b) → a包含b? |
isdisjoint() |
判断两个集合是否有交集 | 没有交集返回True |
a = {1, 2, 3}
b = {1, 2}
print(b.issubset(a)) # True(b是a的子集)
print(a.isdisjoint({4,5})) # True(没有共同元素)
四、集合内置方法速查表
增删类:
| 方法 | 描述 |
|---|---|
add(elem) |
添加单个元素 |
update(iterable) |
批量添加元素 |
remove(elem) |
删除指定元素(不存在报错) |
discard(elem) |
删除指定元素(不存在不报错) |
pop() |
随机删除并返回一个元素 |
clear() |
清空所有元素 |
运算类:
| 方法 | 描述 | 对应运算符 |
|---|---|---|
union() |
返回并集 | | |
intersection() |
返回交集 | & |
difference() |
返回差集 | - |
symmetric_difference() |
返回对称差集 | ^ |
intersection_update() |
原地更新为交集 | — |
difference_update() |
原地更新为差集 | — |
symmetric_difference_update() |
原地更新为对称差集 | — |
判断类:
| 方法 | 描述 |
|---|---|
isdisjoint() |
判断是否无交集(无交集返回True) |
issubset() |
判断是否为子集 |
issuperset() |
判断是否为父集 |
其他:
| 方法/函数 | 描述 |
|---|---|
copy() |
浅复制集合 |
len(set) |
返回集合元素个数 |
in / not in |
判断元素是否存在 |
今日核心总结
-
集合 = 无序 + 不重复:
- 用
{}定义,空集合必须用set()。 - 自动去重是最大特点,适合做数据去重。
- 元素必须不可变(不能放列表、字典)。
- 用
-
增删查三板斧:
- 增:
add()单元素、update()批量。 - 删:
discard()更安全(不报错),remove()更严格(报错)。 - 查:用
in判断存在,用for遍历(无序)。
- 增:
-
集合运算 = 数学集合:
- 并集
|、交集&、差集-、对称差集^。 - 运算符和方法等价,运算符更简洁直观。
issubset()判子集、isdisjoint()判无交集。
- 并集
-
与列表、字典的对比:
| 特性 | 列表 (list) | 字典 (dict) | 集合 (set) |
|---|---|---|---|
| 符号 | [] |
{key:val} |
{} 或 set() |
| 有序 | 是 | 3.7+有序 | 否 |
| 可重复 | 是 | 键不重复 | 否(自动去重) |
| 可变 | 是 | 是 | 是 |
| 索引 | 支持 | 按键访问 | 不支持 |
注:已经使用DeepSeek进行整理精简核心内容,些许不理解的配合个人笔记进行理解。
更多推荐


所有评论(0)