📚 Python 集合(Set)完整笔记

集合(set)是 Python 中一种 无序、不重复、可变 的容器类型,用于高效地存储唯一元素,并支持数学上的集合运算(如并集、交集、差集等)。


一、集合的基本特性

特性说明
无序性元素没有固定顺序,不支持下标索引(如 s[0] 会报错)
唯一性自动去重,重复元素只保留一个
可变性可以添加、删除元素(但元素本身必须是不可变类型
元素限制只能包含不可变对象(如 intstrtuple),不能包含 listdictset
# ✅ 合法集合
s1 = {1, "hello", (2, 3)}

# ❌ 非法集合(会报错)
# s2 = {[1, 2], 3}      # TypeError: unhashable type: 'list'
# s3 = {{1, 2}, 3}      # TypeError: unhashable type: 'set'

二、集合的定义

1. 字面量定义

my_set = {"123", "456", "789", "123"}  # 自动去重
print(my_set)  # {'456', '123', '789'}(顺序不定)

2. 空集合定义

empty_set = set()      # ✅ 正确
empty_dict = {}        # ❌ 这是空字典!不是集合!

⚠️ 重要{} 创建的是 字典(dict),不是集合!


三、集合的常用操作

1. 添加元素:add(element)

s = {"123", "456"}
s.add("Python")
print(s)  # {'456', 'Python', '123'}

2. 移除元素:remove(element)

  • 元素必须存在,否则报错 KeyError
s.remove("123")
print(s)  # {'456', 'Python'}

💡 安全移除:用 discard(element)(不存在也不报错)

s.discard("不存在的元素")  # 安静地什么都不做

3. 随机弹出元素:pop()

  • 因为无序,弹出哪个不确定
  • 空集合调用会报错
s = {"123", "456", "789"}
element = s.pop()
print(f"弹出: {element}, 剩余: {s}")

4. 清空集合:clear()

s.clear()
print(s)  # set()

四、集合的运算(数学操作)

1. 差集:difference(other)

  • 返回:self 中但不在 other 中的元素
  • 不修改原集合
set1 = {1, 2, 3}
set2 = {1, 5, 6}
diff = set1.difference(set2)  # {2, 3}
print(diff)

✅ 等价写法:set1 - set2


2. 差集更新:difference_update(other)

  • 直接修改原集合,移除与 other 的交集部分
  • 返回 None
set1 = {1, 2, 3}
set2 = {1, 5, 6}
set1.difference_update(set2)  # set1 变为 {2, 3}
print(set1)  # {2, 3}

✅ 等价写法:set1 -= set2


3. 并集:union(other)

  • 返回:两个集合所有不重复元素的集合
  • 不修改原集合
set1 = {1, 2, 3}
set2 = {1, 5, 6}
union_set = set1.union(set2)  # {1, 2, 3, 5, 6}

✅ 等价写法:set1 | set2


4. 其他常用运算(拓展)

操作方法运算符说明
交集intersection()&两个集合都有的元素
对称差集symmetric_difference()^两个集合有但不共有的元素
子集判断issubset()<=A 是否是 B 的子集
超集判断issuperset()>=A 是否是 B 的超集
A = {1, 2, 3}
B = {2, 3, 4}

print(A & B)          # {2, 3}(交集)
print(A ^ B)          # {1, 4}(对称差集)
print({1, 2} <= A)    # True({1,2} 是 A 的子集)

五、集合的遍历

  • 只能用 for 循环(因为无序,不支持索引)
  • 不能用 while + 索引
my_set = {1, 2, 3, 4, 5}
for element in my_set:
    print(element)

六、综合案例:列表去重

my_list = ["hang", "lannn", "hang", "lannn", "123", "456", "123", "456"]

# 方法1:用集合去重(最简洁)
my_set = set(my_list)
print(my_set)  # {'lannn', '456', 'hang', '123'}

# 方法2:保持原顺序的去重(需用 dict 或 list)
unique_list = list(dict.fromkeys(my_list))
print(unique_list)  # ['hang', 'lannn', '123', '456']

⚠️ 注意:集合去重会丢失原始顺序!如需保留顺序,用 dict.fromkeys()collections.OrderedDict


七、集合 vs 其他容器

容器有序可变允许重复主要用途
list存储有序、可变序列
tuple存储固定数据
str文本处理
set去重、成员检测、集合运算
dict✅(Python 3.7+)❌(键唯一)键值对映射

八、性能优势

  • 成员检测极快x in my_set 平均时间复杂度 O(1)(列表是 O(n))
  • 去重高效set(my_list) 是去重最快的方式
# 快速判断元素是否存在
allowed = {"admin", "user", "guest"}
if role in allowed:
    print("权限通过")

✅ 总结口诀

“集合无序又唯一,可变但元素要不可变;
去重就用 set(),成员检测快如电。
add/remove/pop/clear,差集并集全支持;
遍历只能用 for,空集别写 {}!”

掌握集合,让你的数据处理更高效、更简洁!✨

更多推荐