来源:黑马程序员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] 的并集(不重复元素)。

  1. D(集合无序,不支持索引访问)
  2. B(交集:两个集合都有的元素)
  3. set()
  4. remove() 删除不存在的元素会抛 KeyErrordiscard() 删除不存在的元素什么也不做(静默)
  5. 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}