一、集合 (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(1inname)# Trueprint(10notinname)# True# 遍历集合(注意:无序)foriinname:print(i)# 获取集合长度print(len(name))# 5# 判断集合是否为空print(notname)# 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进行整理精简核心内容,些许不理解的配合个人笔记进行理解。