Python 中的集合(set)知识大全
Python 中的集合(set)知识大全
🧱 一、什么是集合(set)
集合(set) 是一个 无序、元素唯一、可变 的数据结构。
可以理解为“没有重复元素的列表”。
📘 示例:
fruits = {"apple", "banana", "orange"}
✅ 特点:
无序(没有索引,不能像列表那样用 [0] 访问)
元素唯一(自动去重)
可变(可以增删元素)
支持数学集合运算(交、并、差、对称差)
⚙️ 二、集合的创建方式
# 方法1:用花括号 {}
s1 = {1, 2, 3}# 方法2:用 set() 构造函数
s2 = set([1, 2, 2, 3]) # 自动去重 -> {1, 2, 3}# 方法3:创建空集合
s3 = set() # ✅ 正确
# s4 = {} # ❌ 这是一个空字典,不是集合!
🔍 三、基本操作
s = {1, 2, 3}# 添加元素
s.add(4) # {1, 2, 3, 4}# 一次添加多个
s.update([5, 6]) # {1, 2, 3, 4, 5, 6}# 删除元素
s.remove(2) # 删除存在的元素(不存在时报错)
s.discard(10) # 删除不存在的元素时不会报错
s.pop() # 随机删除一个元素
s.clear() # 清空集合
🧠 四、集合运算(超重要🔥)
Python 的集合类型支持各种 数学集合操作:
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}# 并集 union
print(a | b) # {1, 2, 3, 4, 5, 6}
print(a.union(b)) # 同上# 交集 intersection
print(a & b) # {3, 4}
print(a.intersection(b))# 差集 difference
print(a - b) # {1, 2} (在 a 中但不在 b 中)
print(b - a) # {5, 6}# 对称差集 symmetric_difference
print(a ^ b) # {1, 2, 5, 6} (属于 a 或 b,但不同时属于)
🔎 五、集合的关系运算
集合也可以用来判断包含、相等等关系:
a = {1, 2, 3}
b = {1, 2}
c = {1, 2, 3}b.issubset(a) # True,b 是 a 的子集
a.issuperset(b) # True,a 是 b 的超集
a.isdisjoint(b) # False,有交集
a == c # True,集合相等只看元素,不看顺序
🧩 六、集合推导式(Set Comprehension)
像列表推导式一样,可以快速生成集合:
squares = {x ** 2 for x in range(5)}
# {0, 1, 4, 9, 16}# 去重的常用技巧
nums = [1, 2, 2, 3, 3, 3]
unique = {x for x in nums} # {1, 2, 3}
⚡ 七、集合常用方法汇总
方法 | 作用 |
---|---|
add(x) | 添加元素 |
update(iterable) | 添加多个元素 |
remove(x) | 删除元素(不存在时报错) |
discard(x) | 删除元素(不存在不报错) |
pop() | 随机删除一个元素 |
clear() | 清空集合 |
copy() | 浅拷贝 |
union() | 并集 |
intersection() | 交集 |
difference() | 差集 |
symmetric_difference() | 对称差集 |
issubset() | 是否是子集 |
issuperset() | 是否是超集 |
isdisjoint() | 是否没有交集 |
🧮 八、集合的典型应用场景
1️⃣ 去重(最常见)
nums = [1, 2, 2, 3, 3, 3]
unique_nums = list(set(nums)) # [1, 2, 3]
2️⃣ 判断元素是否存在(比列表更快)
names = {"Alice", "Bob", "Charlie"}
print("Alice" in names) # True
⚡ 集合的查找是 O(1) 时间复杂度,比列表的 O(n) 快很多!
3️⃣ 集合运算过滤数据
students = {"Tom", "Lucy", "Jack"}
passed = {"Lucy", "Jack"}failed = students - passed # {'Tom'}
4️⃣ 去重并排序
data = [4, 2, 2, 5, 1, 1, 3]
unique_sorted = sorted(set(data))
# [1, 2, 3, 4, 5]
🧩 九、不可变集合(frozenset)
有时我们希望集合本身不能被修改,就可以用 frozenset:
a = frozenset([1, 2, 3])
b = frozenset([3, 4])print(a | b) # 并集:frozenset({1, 2, 3, 4})
# a.add(5) ❌ 会报错:frozenset 不可变
用途:作为字典键、放入另一个集合中(因为普通 set 不能嵌套)。
🧠 十、集合 vs 列表 vs 字典 对比
特性 | set | list | dict |
---|---|---|---|
是否有序 | ❌ | ✅ | ✅(3.7+) |
是否可重复 | ❌ | ✅ | ❌(键唯一) |
是否可变 | ✅ | ✅ | ✅ |
访问方式 | 按值(无索引) | 按索引 | 按键 |
查找速度 | ⚡ O(1) | 🐢 O(n) | ⚡ O(1) |
🧩 十一、实战小例子
✅ 1. 查找两个列表中共有的元素
a = [1, 2, 3, 4]
b = [3, 4, 5, 6]common = set(a) & set(b)
print(common) # {3, 4}
✅ 2. 统计字符串中不重复的字母
s = "hello world"
unique_chars = set(s)
print(unique_chars)
# {'h', 'e', 'l', 'o', ' ', 'w', 'r', 'd'}
✅ 3. 判断是否有交集
a = {"apple", "banana"}
b = {"cherry", "banana"}
print(not a.isdisjoint(b)) # True,有交集
🎯 小结
知识点 | 关键要点 |
---|---|
集合特点 | 无序、唯一、可变 |
主要用途 | 去重、快速查找、集合运算 |
常用运算 | 并集 、交集 &、差集 -、对称差集 |
推导式 | {expr for item in iterable} |
不可变集合 | frozenset |
🧩 一、Python 集合实战练习题(含讲解)
🧠 练习 1:去除重复元素
📘 题目:
有一个列表 nums = [1, 2, 2, 3, 3, 3, 4],请用集合去重并输出结果。
💡 提示:
集合的特点之一就是“元素唯一”。
✅ 答案:
nums = [1, 2, 2, 3, 3, 3, 4]
unique = set(nums)
print(unique)
# {1, 2, 3, 4}
💬 用 set() 去重是最简单、最高效的方法。
如果要保持顺序,可以这样:
unique_ordered = list(dict.fromkeys(nums))
🧠 练习 2:找出两个列表的共有元素(交集)
📘 题目:
a = [1, 2, 3, 4, 5]
b = [4, 5, 6, 7, 8]
请找出两个列表中都出现的数字。
✅ 答案:
common = set(a) & set(b)
print(common)
# {4, 5}
⚡ 集合的交集操作 & 非常高效,比用循环或 if 快得多。
🧠 练习 3:找出只在其中一个列表中的元素(对称差集)
📘 题目:
a = [1, 2, 3]
b = [3, 4, 5]
输出只出现在一个列表中的元素。
✅ 答案:
unique = set(a) ^ set(b)
print(unique)
# {1, 2, 4, 5}
💡 对称差集 ^ 表示“在 a 或 b 中,但不同时在两者中”。
🧠 练习 4:判断子集关系
📘 题目:
A = {"apple", "banana", "cherry"}
B = {"apple", "banana"}
请判断 B 是否是 A 的子集。
✅ 答案:
print(B.issubset(A)) # True
print(A.issuperset(B)) # True
💬 .issubset() 与 .issuperset() 是判断集合包含关系的好帮手。
🧠 练习 5:快速判断某个元素是否存在
names = {"Tom", "Lucy", "Jack"}
判断 “Lucy” 是否在集合中。
✅ 答案:
print("Lucy" in names) # True
🧠 练习 6:集合推导式
📘 题目:
生成一个包含 1~10 之间偶数平方的集合。
✅ 答案:
squares = {x**2 for x in range(1, 11) if x % 2 == 0}
print(squares)
# {4, 16, 36, 64, 100}
🧠 练习 7:统计字符串中不重复的字符数量
📘 题目:
s = "banana"
计算字符串中不重复的字符数量。
✅ 答案:
unique_chars = set(s)
print(len(unique_chars)) # 3
print(unique_chars) # {'b', 'a', 'n'}
🧠 练习 8:从两个集合中删除重复值
📘 题目:
A = {1, 2, 3, 4}
B = {3, 4, 5, 6}
要求:
删除两个集合共有的元素
输出更新后的两个集合
✅ 答案:
common = A & B
A -= common
B -= common
print(A, B)
# {1, 2} {5, 6}
🧠 练习 9:创建不可变集合
📘 题目:
创建一个不能被修改的集合 {1, 2, 3}。
✅ 答案:
frozen = frozenset([1, 2, 3])
print(frozen)
# frozenset({1, 2, 3})
❌ frozen.add(4) 会报错,因为 frozenset 是不可变类型。
🧠 练习 10:求列表中唯一出现过一次的元素
📘 题目:
nums = [1, 2, 2, 3, 4, 4, 5]
找出只出现过一次的数字。
✅ 答案:
nums_set = set(nums)
duplicates = {x for x in nums if nums.count(x) > 1}
unique_once = nums_set - duplicates
print(unique_once)
# {1, 3, 5}
💡 集合运算让这种过滤逻辑非常简洁!