🔮 09. 集合 set 详解

本章概述

学习 Python 集合的定义、操作和常用方法。 预计学习时间:40 分钟


9.1 集合定义

集合是无序、不重复的元素集合,类似数学中的集合概念。

# 空集合(注意:不能用{},那是空字典!)
s = set()
 
# 有元素的集合
s = {1, 2, 3, 4, 5}
 
# 自动去重
s = {1, 2, 2, 3, 3, 3}
print(s)  # {1, 2, 3}

空集合

{} 是空字典,不是空集合! 空集合必须用 set() 创建。

集合特点

  • ✅ 元素不重复(自动去重)
  • ✅ 无序(没有索引,不能切片)
  • ✅ 元素必须是不可变类型
  • ✅ 支持数学集合运算(交集、并集、差集等)
  • ✅ 查找速度非常快(O(1))

9.2 集合的增删改查

s = {1, 2, 3}
 
# add:添加一个元素
s.add(4)
print(s)  # {1, 2, 3, 4}
 
# update:添加多个元素(可以是列表、元组、集合等)
s.update([5, 6])
print(s)  # {1, 2, 3, 4, 5, 6}

s = {1, 2, 3, 4, 5}
 
# remove:删除指定元素(不存在会报错)
s.remove(3)
print(s)  # {1, 2, 4, 5}
# s.remove(10)  # ❌ KeyError
 
# discard:删除指定元素(不存在不报错)
s.discard(4)
print(s)  # {1, 2, 5}
s.discard(10)  # 不报错,什么也不做
 
# pop:随机删除并返回一个元素
s.pop()
 
# clear:清空集合
s.clear()
print(s)  # set()

s = {1, 2, 3}
 
# 判断元素是否存在
3 in s     # True
10 in s    # False
 
# 长度
len(s)     # 3

集合不能通过索引取值

集合是无序的,没有索引,不能用 s[0] 这种方式取值。


9.3 集合运算(数学集合)

并集 union

两个集合的所有元素(去重)

a = {1, 2, 3}
b = {3, 4, 5}
 
a | b          # {1, 2, 3, 4, 5}
a.union(b)     # {1, 2, 3, 4, 5}

交集 intersection

两个集合共有的元素

a = {1, 2, 3}
b = {3, 4, 5}
 
a & b              # {3}
a.intersection(b)  # {3}

差集 difference

在a中但不在b中的元素

a = {1, 2, 3}
b = {3, 4, 5}
 
a - b           # {1, 2}
a.difference(b) # {1, 2}

对称差集 symmetric_difference

不同时在两个集合中的元素(并集 - 交集)

a = {1, 2, 3}
b = {3, 4, 5}
 
a ^ b                    # {1, 2, 4, 5}
a.symmetric_difference(b) # {1, 2, 4, 5}

子集 subset

a = {1, 2}
b = {1, 2, 3}
 
a <= b           # True(a是b的子集)
a.issubset(b)    # True
 
a < b            # True(a是b的真子集)

超集 superset

a = {1, 2, 3}
b = {1, 2}
 
a >= b             # True(a是b的超集)
a.issuperset(b)    # True
 
a > b              # True(a是b的真超集)

是否不相交

a = {1, 2}
b = {3, 4}
 
a.isdisjoint(b)  # True(没有共同元素)

9.4 集合遍历

s = {1, 2, 3}
 
# 遍历元素
for item in s:
    print(item)
 
# 带索引遍历(用enumerate,但索引没意义)
for i, item in enumerate(s):
    print(i, item)

注意

集合遍历的顺序是不确定的,不要依赖顺序。


9.5 集合推导式

Python 特色

和列表推导式类似,集合也有推导式。

# 集合推导式
s = {x**2 for x in range(5)}
# {0, 1, 4, 9, 16}
 
# 带条件
s = {x for x in range(10) if x % 2 == 0}
# {0, 2, 4, 6, 8}
 
# 自动去重
words = ["hello", "world", "hello", "python"]
s = {len(w) for w in words}
# {5, 6}

9.6 集合的常用场景

1. 列表去重

最常用!

列表去重最简单的方法就是转成集合。

lst = [1, 2, 2, 3, 3, 3, 4, 5]
unique_lst = list(set(lst))
print(unique_lst)  # [1, 2, 3, 4, 5]

注意

转成集合后顺序会丢失,如果需要保持原顺序,要用其他方法。 保持顺序的去重方法见 列表代码片段

2. 快速查找

集合的 in 操作比列表快很多(O(1) vs O(n))

# 大量数据判断是否存在时,用集合
black_list = {"user1", "user2", "user3", ...}
if user in black_list:
    ...

3. 数学集合运算

找共同好友、共同兴趣等:

user1_friends = {"Tom", "Jerry", "Alice"}
user2_friends = {"Tom", "Bob", "Charlie"}
 
# 共同好友
common = user1_friends & user2_friends  # {'Tom'}
 
# user1的好友中user2没有的
only_user1 = user1_friends - user2_friends  # {'Jerry', 'Alice'}

9.7 frozenset 不可变集合

frozenset 是不可变的集合,类似元组和列表的关系。

fs = frozenset([1, 2, 3])
print(fs)  # frozenset({1, 2, 3})
 
# 不能修改
# fs.add(4)  # ❌ 报错

特点:

  • 不可变(不能增删改)
  • 可以当字典的 key
  • 可以作为另一个集合的元素

🔗 相关章节


📝 我的笔记

在这里记录你的理解、疑问和练习代码

# 你的练习代码
 

✅ 本章检查清单

  • 掌握集合的定义和特点
  • 掌握集合的增删改查操作
  • 会使用集合的数学运算(交并差等)
  • 理解集合推导式
  • 知道集合的常用场景(去重、快速查找)
  • 了解 frozenset 不可变集合