当前位置:首页>python>Python基础笔记9——数据容器:集合(Set)从入门到精通

Python基础笔记9——数据容器:集合(Set)从入门到精通

  • 2026-10-11 07:45:54
Python基础笔记9——数据容器:集合(Set)从入门到精通

🚀 什么是集合?

集合是Python中的一种数据容器,它有三个核心特点:

  1. 元素不重复——自动去重,绝不含糊

  2. 无序——没有下标,不能像列表那样索引

  3. 可变——可以增删改查

就像一个装东西的盒子,每个东西都是独一无二的,没有先后顺序。

有点像高中数学中的集合。


📦 定义集合

方式一:使用 {} 大括号

# 定义一个集合s4 = {'前端', 'AI', '日志'}print(s4)  # {'前端', '日志', 'AI'} 每次打印顺序不一样# 自动去重!s2 = {1, 2, 2, 3, 3, 3, 4}print(s2)  # {1, 2, 3, 4}

方式二:使用 set() 和 frozenset() 函数

# 空集合(注意:{} 是空字典,不是空集合!)s1 = set()print(s)  # set()# 将列表转成集合(自动去重)list1 = [1, 2, 2, 3, 3, 3]s2 = set(list1)print(s)  # {1, 2, 3}# 定义不可变集合s3 = frozenset({1,2,3,4,2})print(s3) # frozenset({1, 2, 3, 4})# 只有不可元素才能嵌入集合中list2 = (1,2)list3 = [1,2]s4 = frozenset({1,2})s5 = {1,2}s6 = {list2,3,4}s7 = {list3,3,4} # 报错,list3可变s8 = {s4,3,4}s9 = {s5,3,4} # 报错,s5是可变集合

⚠️ 踩坑提醒:{} 是空字典,不是空集合!空集合必须用 set() 定义。


✏️ 增删改查操作

1. 添加元素

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

2. 删除元素

s = {1, 2, 3, 4, 5}# 删除指定元素(如果不存在会报错)s.remove(3)print(s)  # {1, 2, 4, 5}# 删除指定元素(如果不存在不会报错)s.discard(100)  # 什么都不会发生# 随机删除一个元素deleted = s.pop()print(deleted)  # 随机返回一个被删除的元素print(s)  # 剩下的元素# 清空集合s.clear()print(s)  # set()

3. 查询元素

s = {1, 2, 3, 4, 5}# 判断元素是否在集合中print(3 in s)  # Trueprint(10 in s)  # False

💡 小贴士:集合的查找速度超级快!比列表快多了,因为它用了哈希表。


🔧 常用方法

s = {1, 2, 3, 4, 5}# 获取元素个数print(len(s))  # 5# 复制集合s2 = s.copy()print(s2)  # {1, 2, 3, 4, 5}

🔢 数学运算(集合的核心优势!)

集合最大的亮点、最实用就是支持数学中的集合运算!

1. 并集(| 或 union)

两个集合所有的元素合在一起

# 类似高中数学中并集s1 = {1, 2, 3}s2 = {3, 4, 5}# 两种方式print(s1 | s2)  # {1, 2, 3, 4, 5}print(s1.union(s2))  # {1, 2, 3, 4, 5}

2. 交集(& 或 intersection)

两个集合都有的元素

s1 = {1, 2, 3}s2 = {3, 4, 5}print(s1 & s2)  # {3}print(s1.intersection(s2))  # {3}

3. 差集(- 或 difference)

在第一个集合有,但第二个集合没有的元素

s1 = {1, 2, 3}s2 = {3, 4, 5}print(s1 - s2)  # {1, 2}print(s1.difference(s2))  # {1, 2}s1.difference_update(s2) # difference_update 会改变集合s1print(s1) # {1, 2}

4. 对称差集(^ 或 symmetric_difference)

两个集合各自独有的元素(去掉交集)

s1 = {1, 2, 3}s2 = {3, 4, 5}print(s1 ^ s2)  # {1, 2, 4, 5}print(s1.symmetric_difference(s2))  # {1, 2, 4, 5}

5. 子集与超集

s1 = {1, 2, 3}s2 = {1, 2, 3, 4, 5}s3 = {6, 7}# 判断是否是子集print(s1.issubset(s2))  # True(s1 是 s2 的子集)# 判断是否是超集print(s2.issuperset(s1))  # True(s2 是 s1 的超集,s2包含了s1所有元素,返回True)# 判断是否是交集print(s3.isdisjoint(s2)) # True, 只要有一个公共元素,则返回False

🔄 循环遍历

s = {1, 2, 3, 4, 5}# 直接遍历元素for item in s:    print(item)

⚠️ 注意:集合是无序的,遍历顺序不固定!


🎯 实战案例

案例1:列表去重

# 有一个包含重复数据的列表names = ['张三', '李四', '王五', '张三', '李四', '赵六']# 转成集合去重,再转回列表unique_names = list(set(names))print(unique_names)  # ['张三', '李四', '王五', '赵六'](顺序可能不同)

案例2:找出共同好友

# 小明的好友xiaoming_friends = {'张三', '李四', '王五', '赵六'}# 小红的好友xiaohong_friends = {'李四', '王五', '钱七', '孙八'}# 共同好友(交集)common_friends = xiaoming_friends & xiaohong_friendsprint('共同好友:', common_friends)  # {'李四', '王五'}# 小明的独有的好友only_xiaoming = xiaoming_friends - xiaohong_friendsprint('小明独有的好友:', only_xiaoming)  # {'张三', '赵六'}# 所有好友(并集)all_friends = xiaoming_friends | xiaohong_friendsprint('所有好友:', all_friends)

📊 列表、元组、集合对比

特性

列表

元组

集合

是否有序

✅ 是

✅ 是

❌ 否

是否可变

✅ 是

❌ 否

✅ 是

是否允许重复

✅ 是

✅ 是

❌ 否

下标索引

✅ 可以

✅ 可以

❌ 不可以

查找速度

较慢

较慢

极快

最新文章

随机文章