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 不存在,抛出 KeyErrors.remove(2)
s.discard(x)删除元素 x❌ 若 x 不存在,静默忽略s.discard(99)
s.pop()随机删除并返回一个元素✅ 若集合为空,抛出 KeyErroritem = 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

✅ 六、重要注意事项

  1. 元素必须可哈希
    集合中的元素必须是不可变类型(如 int, str, tuple),不能是 listdictset

    s = {[1,2]}  # ❌ TypeError: unhashable type: 'list'
  2. 无序性
    遍历时顺序不确定,不要依赖顺序。
  3. 性能优势

    • 成员检测:x in setx in list 快得多(O(1) vs O(n))
    • 去重:set(list) 是最简单的去重方式
  4. 不可变集合
    如果需要一个不可变的集合(可用作字典的 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'}