写 Python 的人啊,迟早都会遇到一个看似不起眼的东西 ------ set(集合) 。 刚开始接触的时候,你可能觉得它没啥用,和 list 差不多嘛。 但当你真的搞懂它,就会发现:这货不仅仅是个工具,它背后其实藏着某种"生活的智慧"。
今天我们就来聊聊 Python 的集合,用最简单的方式,讲清楚它的特性、用法和哲学。

01 集合是什么?
打个比方,你去夜市买水果,摊主抓了一大袋橘子、苹果、香蕉混着给你。 回家一数:
- 有 5 个橘子
- 3 个苹果
- 2 个香蕉
如果这是一个 list,那么它会老老实实地记住你买到的每一个:
ini
fruits = ["orange", "orange", "orange", "orange", "orange", "apple", "apple", "apple", "banana", "banana"]
但如果换成 set,情况就变了。集合只会关心"你买了什么水果",而不会在乎你买了几个:
ini
fruits = {"orange", "apple", "banana"}
要点一:集合里没有重复元素。 无论你丢多少个"橘子"进去,它都只会留一个。
再加个特点:集合里的东西是无序 的。 你去看它,今天可能是 {"banana", "orange", "apple"}
,明天可能就是 {"apple", "banana", "orange"}
,完全不保证顺序。
这就像生活:朋友也许很多,但真正的知己就那么几个,至于先遇见谁、后遇见谁,没那么重要。
02 怎么创建集合?
有两种方式:
1. 用大括号 {}
ini
my_set = {1, 2, 3, "hello"}
print(my_set)
# 输出:{1, 2, 3, 'hello'}
2. 用 set()
函数
特别是当你有一堆重复的数据时,这招简直神器。
ini
numbers = [1, 2, 2, 3, 4, 4, 4]
unique = set(numbers)
print(unique)
# 输出:{1, 2, 3, 4}
注意!空集合不能写成 {}
,因为那是个字典。要写 set()
。
scss
empty = set()
print(empty) # 输出:set()
03 集合能装什么?
集合的元素必须是不可变的。
- 能放的:整数、浮点数、字符串、元组
- 不能放的:列表、字典、另一个集合
比如:
ini
ok_set = {1, 3.14, "hello", (1, 2)}
# ✅ 合法
但如果你写:
ini
bad_set = {[1, 2], {"a": 1}}
# ❌ 报错
因为 list、dict 自身是可变的,会导致唯一性无法判断。
04 集合的常见操作
加元素
go
fruits = {"apple", "banana"}
fruits.add("orange")
print(fruits)
# 输出:{'apple', 'banana', 'orange'}
删元素
ini
numbers = {1, 2, 3, 4, 5}
numbers.remove(3) # 如果元素不存在会报错
numbers.discard(10) # 不存在也不会报错
print(numbers)
随机删一个
ini
n = {1, 2, 3}
x = n.pop()
print(x) # 随机弹出一个
判断在不在集合里
bash
vowels = {'a', 'e', 'i', 'o', 'u'}
print('a' in vowels) # True
print('x' in vowels) # False
05 数学味儿的操作
集合最帅气的地方在这儿:它天生支持数学里的集合运算。
并集(Union)
两个集合合并,自动去重:
css
A = {1, 2, 3}
B = {3, 4, 5}
print(A | B) # {1, 2, 3, 4, 5}
print(A.union(B)) # {1, 2, 3, 4, 5}
交集(Intersection)
找共同的:
css
print(A & B) # {3}
print(A.intersection(B))
差集(Difference)
找出一个集合有,另一个没有的:
bash
print(A - B) # {1, 2}
print(B - A) # {4, 5}
对称差集(Symmetric Difference)
两个集合中不重叠的部分:
bash
print(A ^ B) # {1, 2, 4, 5}
是不是很直观?你完全可以把 Python 当做数学课的小助手。
06 生活中的用法
场景一:快速去重
比如说你有一个名单,结果里面名字重复了好多遍。
scss
names = ["张三", "李四", "王五", "张三", "李四"]
unique_names = list(set(names))
print(unique_names) # ['张三', '李四', '王五']
场景二:查找交集
比如你有两份名单:
- 报名篮球社的
- 报名足球社的
要知道谁"两边都报了",一行代码:
ini
basketball = {"张三", "李四", "王五"}
football = {"王五", "赵六", "张三"}
print(basketball & football) # {'张三', '王五'}
场景三:差集
比如要知道哪些人只报了篮球,没有报足球:
bash
print(basketball - football) # {'李四'}
这就是集合的威力。
07 哲理一角
到这儿,你可能觉得集合只是个去重的工具。 但仔细想想,其实 Python 的集合背后,藏着一点人生智慧:
- 唯一性:真正重要的东西不会重复。朋友再多,知己只有一个。
- 无序性:生命没有固定剧本,你遇见的顺序没那么重要,重要的是那些人最终留在了你的集合里。
- 规则简单:只要记住"不可变"和"唯一"这两条,剩下的世界就井然有序。
写代码久了,你会发现:有些数据结构就是生活的隐喻。 list 代表琐碎,dict 代表关系网,而 set,代表极简、干净。
结语
今天这一篇,我们从"买水果"的小故事出发,把 Python 的 集合(set) 聊清楚了:
- 它唯一、无序
- 它有各种高效的操作(增删查改)
- 它天生支持数学集合运算
- 它在去重、查交集等场景下超实用
更重要的是,集合提醒我们: 别让生活里充满太多重复的垃圾元素,把"唯一的东西"留下来就好。