来源:黑马程序员Python基础课程 + Python 3.11官方文档 + 网络资料整理
一、详细讲解
1.1 集合的基本特性
Python 集合(Set)是无序、不重复的可变容器:
# 创建集合
s1 = {1, 2, 3, 4, 5}
s2 = set([1, 2, 2, 3, 3, 4, 4]) # set()从列表创建,自动去重
print(s2) # {1, 2, 3, 4}
# 创建空集合(不能用{},那是dict)
empty = set()
print(type(empty)) # <class 'set'>
# 集合特点:无序 + 不重复
s = {3, 1, 4, 1, 5, 9, 2, 6}
print(s) # {1, 2, 3, 4, 5, 6, 9}(顺序不确定)
# 自动去重
nums = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique = set(nums)
print(unique) # {1, 2, 3, 4}
1.2 集合的增删操作
s = {1, 2, 3}
# 添加元素
s.add(4) # 添加一个元素
print(s) # {1, 2, 3, 4}
s.add(2) # 已存在的元素,集合不变
print(s) # {1, 2, 3, 4}
s.update([5, 6, 7]) # 批量添加(传入可迭代对象)
print(s) # {1, 2, 3, 4, 5, 6, 7}
# 删除元素
s.remove(3) # 删除指定元素,不存在则抛KeyError
print(s) # {1, 2, 4, 5, 6, 7}
s.discard(10) # 删除指定元素,不存在也不报错
print(s) # {1, 2, 4, 5, 6, 7}
popped = s.pop() # 随机删除并返回一个元素
print(popped) # 1(通常删除第一个)
print(s) # {2, 4, 5, 6, 7}
s.clear() # 清空集合
print(s) # set()
1.3 集合运算(重点)
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}
# 交集:两个集合都有的元素
print(A & B) # {4, 5}
print(A.intersection(B)) # {4, 5}
# 并集:所有元素(去重)
print(A | B) # {1, 2, 3, 4, 5, 6, 7, 8}
print(A.union(B)) # {1, 2, 3, 4, 5, 6, 7, 8}
# 差集:A有B没有的元素
print(A - B) # {1, 2, 3}
print(A.difference(B)) # {1, 2, 3}
# 对称差集:A和B互相没有的元素
print(A ^ B) # {1, 2, 3, 6, 7, 8}
print(A.symmetric_difference(B)) # {1, 2, 3, 6, 7, 8}
# 子集与超集
X = {1, 2, 3}
Y = {1, 2, 3, 4, 5}
print(X < Y) # True(X是Y的真子集)
print(Y > X) # True(Y是X的真超集)
print(X <= Y) # True(X是Y的子集,包含相等情况)
print(Y >= X) # True(Y是X的超集)
# 判断是否相交(无交集返回True)
print(A.isdisjoint(B)) # False(有交集4,5)
C = {10, 20}
print(A.isdisjoint(C)) # True(无交集)
1.4 集合的成员测试
s = {1, 2, 3, 4, 5}
print(3 in s) # True
print(10 in s) # False
print(3 not in s) # False
# 集合成员测试比列表快很多(O(1) vs O(n))
1.5 集合推导式
# 基本集合推导式
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = {x for x in nums if x % 2 == 0}
print(evens) # {2, 4, 6, 8, 10}
# 带计算的集合推导式
squares = {x**2 for x in range(1, 6)}
print(squares) # {1, 4, 9, 16, 25}
# 实际应用:从字符串提取不重复字符
text = "hello world"
unique_chars = {c for c in text if c.isalpha()}
print(unique_chars) # {'h', 'e', 'l', 'o', 'w', 'r', 'd'}
1.6 frozenset(不可变集合)
frozenset 是不可变版本,创建后不能修改:
# frozenset 创建
fs = frozenset([1, 2, 3, 4, 5])
print(fs) # frozenset({1, 2, 3, 4, 5})
# 支持集合运算(不修改原对象)
A = frozenset([1, 2, 3])
B = frozenset([2, 3, 4])
print(A & B) # frozenset({2, 3})
print(A | B) # frozenset({1, 2, 3, 4})
# 可以作为字典的键
mapping = {frozenset(["a", "b"]): "ab", frozenset(["c", "d"]): "cd"}
print(mapping) # {frozenset({'a', 'b'}): 'ab', frozenset({'c', 'd'}): 'cd'}
1.7 实际应用场景
# 场景1:列表去重(顺序可能改变)
nums = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique = list(set(nums))
print(unique) # [1, 2, 3, 4]
# 场景2:找出两个列表的共同元素
list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]
common = set(list1) & set(list2)
print(list(common)) # [4, 5]
# 场景3:排除重复元素
all_items = [1, 2, 3, 4, 5]
exclude = {3, 4}
filtered = [x for x in all_items if x not in exclude]
print(filtered) # [1, 2, 5]
二、背诵版
集合特性 → 无序、不重复、可变 创建 → set()(不能用{},那是dict) 去重 → set(列表) 添加 → add()单个 / update()批量 删除 → remove()抛异常 / discard()不抛 / pop()随机 交集 → A & B 或 A.intersection(B) 并集 → A | B 或 A.union(B) 差集 → A - B 或 A.difference(B) 对称差 → A ^ B 或 A.symmetric_difference(B) 子集 → A < B(A是B的真子集) frozenset → 不可变集合,可作字典键三、考前记忆
| 操作/方法 | 说明 | 示例 |
|---|---|---|
set() |
创建空集合 | set() |
s.add(x) |
添加元素 | {1}.add(2) → {1,2} |
s.update(iter) |
批量添加 | {1}.update([2,3]) → {1,2,3} |
s.remove(x) |
删除(不存在抛异常) | — |
s.discard(x) |
删除(不存在不报错) | — |
A & B |
交集 | {1,2} & {2,3} → {2} |
A | B |
并集 | {1,2} | {2,3} → {1,2,3} |
A - B |
差集 | {1,2} - {2,3} → {1} |
A ^ B |
对称差集 | {1,2} ^ {2,3} → {1,3} |
A < B |
真子集 | {1} < {1,2} → True |
frozenset |
不可变集合 | 可作字典键 |
四、测试题
1. 单选题: 以下哪个不是集合的特性?
- A. 无序
- B. 不重复
- C. 可变(可增删)
- D. 支持索引访问
2. 单选题: {1, 2, 3} & {2, 3, 4} 的结果是?
- A.
{1, 2, 3, 4} - B.
{2, 3} - C.
{1, 4} - D.
{2}
3. 判断题: frozenset 可以作为字典的键。
4. 填空题: 创建一个空集合应该用 ______(不能写 {})。
5. 简答题: 比较 remove() 和 discard() 的区别。
6. 代码题: 找出列表 [1,2,3,4,5,6] 和 [4,5,6,7,8,9] 的并集(不重复元素)。
- D(集合无序,不支持索引访问)
- B(交集:两个集合都有的元素)
- ✓
set()remove()删除不存在的元素会抛KeyError,discard()删除不存在的元素什么也不做(静默)-
a = [1, 2, 3, 4, 5, 6] b = [4, 5, 6, 7, 8, 9] union = set(a) | set(b) print(union) # {1, 2, 3, 4, 5, 6, 7, 8, 9}