Python 的 集合(set) 是一种无序、不重复、可变的容器类型,常用于去重、成员检测和数学集合运算。
⚠️ 注意:集合没有“修改单个元素”的概念(因为元素不可变且无索引),所谓“改”通常是通过“删 + 增”实现,或使用集合运算生成新集合。
✅ Python 集合(set)常用方法 —— 按 CRUD 分类
🔹 一、C - Create(创建)
| 方法 / 语法 | 说明 | 示例 |
|---|---|---|
set() | 创建空集合 | s = set() |
set(iterable) | 从可迭代对象创建集合(自动去重) | s = set([1,2,2,3]) → {1,2,3} |
{1, 2, 3} | 字面量创建(更高效) | s = {1, 2, 'a'} |
❗ 不能用 {} 创建空集合(那是空字典)!🔹 二、R - Read / Query(读取 / 查询)
集合不支持索引和切片(无序),但支持以下查询操作:
| 操作 | 说明 | 示例 |
|---|---|---|
x in s | 成员检测(高效!O(1)) | 'a' in {'a','b'} → True |
len(s) | 获取元素个数 | len({1,2,3}) → 3 |
for x in s: | 遍历所有元素(顺序不定) | for item in my_set: print(item) |
max(s), min(s) | 最大/最小值(元素可比较) | max({3,1,2}) → 3 |
any(s), all(s) | 判断是否有真值 / 全为真 | any({0,1}) → True |
✅ 集合的成员检测比列表快得多(底层是哈希表)!
🔹 三、U - Update(更新 / 修改)
集合不能直接修改某个元素(无索引,且元素必须不可变),但可通过以下方式“更新”内容:
| 方法 | 功能说明 | 是否修改原集合 | 示例 | ||
|---|---|---|---|---|---|
s.add(x) | 添加一个元素(若已存在则忽略) | ✅ 是 | s.add(4) | ||
s.update(iterable) | 添加多个元素(展开 iterable) | ✅ 是 | s.update([4,5])s.update({6,7}) | ||
| `s | = other` | 并集更新(等价于 update) | ✅ 是 | `s | = {8,9}` |
s &= other | 交集更新(保留共有元素) | ✅ 是 | s &= {1,2,10} | ||
s -= other | 差集更新(移除 other 中的元素) | ✅ 是 | s -= {1} | ||
s ^= other | 对称差集更新(保留不同元素) | ✅ 是 | s ^= {2,3} |
💡 这些“就地运算符”(|=,&=,-=等)会直接修改原集合。
🔹 四、D - Delete(删除)
| 方法 | 功能说明 | 是否报错 | 示例 |
|---|---|---|---|
s.remove(x) | 删除元素 x | ✅ 若 x 不存在,抛出 KeyError | s.remove(2) |
s.discard(x) | 删除元素 x | ❌ 若 x 不存在,静默忽略 | s.discard(99) |
s.pop() | 随机删除并返回一个元素 | ✅ 若集合为空,抛出 KeyError | item = s.pop() |
s.clear() | 清空所有元素 | ❌ 不报错 | s.clear() → set() |
✅ 推荐使用discard()避免异常;pop()常用于“逐个处理集合元素”。
✅ 五、其他常用集合运算方法(返回新集合)
这些方法不修改原集合,而是返回新集合:
| 方法 | 等价运算符 | 功能 | 示例 |
|---|---|---|---|
s.union(other) | s # other | 并集(所有元素) | {1,2} # {2,3} → {1,2,3} |
s.intersection(other) | s & other | 交集(共有元素) | {1,2} & {2,3} → {2} |
s.difference(other) | s - other | 差集(在 s 不在 other) | {1,2} - {2,3} → {1} |
s.symmetric_difference(other) | s ^ other | 对称差集(不同元素) | {1,2} ^ {2,3} → {1,3} |
s.issubset(other) | s <= other | 是否为子集 | {1,2} <= {1,2,3} → True |
s.issuperset(other) | s >= other | 是否为超集 | {1,2,3} >= {1,2} → True |
s.isdisjoint(other) | — | 是否无交集(交集为空) | {1,2}.isdisjoint({3,4}) → True |
✅ 六、重要注意事项
元素必须可哈希:
集合中的元素必须是不可变类型(如int,str,tuple),不能是list、dict、set。s = {[1,2]} # ❌ TypeError: unhashable type: 'list'- 无序性:
遍历时顺序不确定,不要依赖顺序。 性能优势:
- 成员检测:
x in set比x in list快得多(O(1) vs O(n)) - 去重:
set(list)是最简单的去重方式
- 成员检测:
不可变集合:
如果需要一个不可变的集合(可用作字典的 key),使用frozenset:fs = frozenset([1,2,3]) d = {fs: "value"} # ✅ 合法
✅ 七、快速记忆口诀
- 增:
add(加一个)、update(加多个)- 删:
remove(严格删)、discard(安全删)、pop(随机删)- 查:
in判断快,len数多少- 改:无直接改,靠运算更新(
|=,&=,-=)- 算:并
|、交&、差-、对称差^
这份总结覆盖了集合的全部核心操作,建议结合代码练习巩固。例如:
# 练习:去重 + 求交集
user_tags = ['python', 'java', 'python', 'go']
all_tags = {'python', 'c++', 'rust'}
unique_tags = set(user_tags)
common = unique_tags & all_tags
print(common) # {'python'}