一、集合 (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 判断元素是否存在

今日核心总结

  1. 集合 = 无序 + 不重复

    • {} 定义,空集合必须用 set()
    • 自动去重是最大特点,适合做数据去重。
    • 元素必须不可变(不能放列表、字典)。
  2. 增删查三板斧

    • 增:add() 单元素、update() 批量。
    • 删:discard() 更安全(不报错),remove() 更严格(报错)。
    • 查:用 in 判断存在,用 for 遍历(无序)。
  3. 集合运算 = 数学集合

    • 并集 |、交集 &、差集 -、对称差集 ^
    • 运算符和方法等价,运算符更简洁直观。
    • issubset() 判子集、isdisjoint() 判无交集。
  4. 与列表、字典的对比

特性 列表 (list) 字典 (dict) 集合 (set)
符号 [] {key:val} {}set()
有序 3.7+有序
可重复 键不重复 否(自动去重)
可变
索引 支持 按键访问 不支持

注:已经使用DeepSeek进行整理精简核心内容,些许不理解的配合个人笔记进行理解。

更多推荐