一、集合的定义与特性
集合(Set) 是 Python 中用于存储 无序、唯一元素 的容器。核心特性:
-
元素唯一性:集合中不允许重复元素,自动去重。
-
无序性:元素存储顺序与添加顺序无关,无法通过索引访问。
-
可变性:集合本身可动态修改(但元素必须是 不可变类型)。
-
高效操作:基于哈希表实现,查找、添加、删除的时间复杂度为 O(1)。
二、集合的创建
方法1:直接定义
# 空集合(注意:不能用 {},这会创建字典)
empty_set = set()
# 带初始元素的集合
fruits = {"apple", "banana", "orange"} # 自动去重
方法2:从其他序列转换
numbers = set([1, 2, 2, 3]) # {1, 2, 3}
chars = set("hello") # {'h', 'e', 'l', 'o'}
方法3:集合推导式(Set Comprehension)
squares = {x**2 for x in range(5)} # {0, 1, 4, 9, 16}
三、集合的常见操作
操作 | 描述 | 示例 |
---|---|---|
添加元素 | ||
add() | 添加单个元素 | s.add(4) |
update() | 合并其他集合/序列 | s.update([4,5], {6}) |
删除元素 | ||
remove() | 移除指定元素(不存在则报错) | s.remove(3) |
discard() | 安全移除元素(不存在不报错) | s.discard(3) |
pop() | 随机弹出元素(集合为空报错) | s.pop() |
clear() | 清空集合 | s.clear() |
成员检测 | ||
in 操作符 | 判断元素是否存在 | if 2 in s: ... |
大小信息 | ||
len() | 获取元素数量 | len(s) |
四、集合的数学运算
Python 集合支持标准的数学集合运算:
1. 并集(Union)
A = {1, 2}
B = {2, 3}
print(A | B) # {1, 2, 3}
print(A.union(B)) # 同上
2. 交集(Intersection)
print(A & B) # {2}
print(A.intersection(B))
3. 差集(Difference)
print(A - B) # {1}
print(A.difference(B))
4. 对称差集(Symmetric Difference)
print(A ^ B) # {1, 3}
print(A.symmetric_difference(B))
5. 子集/超集判断
C = {1, 2}
print(C <= A) # True(C 是 A 的子集)
print(A.issuperset(C)) # True(A 是 C 的超集)
五、不可变集合(frozenset)
用于创建不可修改的集合:
fs = frozenset([1, 2, 3])
# fs.add(4) # 报错:AttributeError
六、实际应用场景
1. 数据去重
names = ["Alice", "Bob", "Alice", "Charlie"]
unique_names = set(names) # {'Alice', 'Bob', 'Charlie'}
2. 关系测试
# 找出两个列表的共同元素
list1 = [1, 2, 3]
list2 = [2, 3, 4]
common = set(list1) & set(list2) # {2, 3}
3. 过滤重复数据
# 从日志中提取唯一 IP 地址
logs = ["192.168.1.1", "10.0.0.1", "192.168.1.1"]
unique_ips = {log.split()[0] for log in logs}
4. 集合运算优化
# 统计两篇文章的共有词汇和独有词汇
article1_words = {"data", "science", "python"}
article2_words = {"machine", "learning", "python"}
common_words = article1_words & article2_words # {"python"}
unique_to_article1 = article1_words - article2_words # {"data", "science"}
七、性能特点与注意事项
-
查找速度极快:检查元素是否存在时,集合比列表快得多:
# 列表:O(n) 时间 if 1000000 in my_list: ... # 集合:O(1) 时间 if 1000000 in my_set: ...
-
内存占用较高:集合需要存储哈希表结构,内存消耗通常大于列表。
-
元素必须可哈希:集合中的元素必须是不可变类型(如数字、字符串、元组),不能包含列表或字典:
valid_set = {1, "a", (2, 3)} # 合法 invalid_set = {[1, 2]} # 报错:TypeError
-
无序性导致的问题:
# 不要依赖遍历顺序 for item in my_set: print(item) # 顺序可能每次不同
八、集合与其他数据结构的对比
特性 | 列表(List) | 字典(Dict) | 集合(Set) |
---|---|---|---|
元素唯一性 | 允许重复 | 键唯一 | 元素唯一 |
访问方式 | 索引 | 键 | 无法直接索引 |
内存占用 | 较低 | 较高 | 较高 |
典型用途 | 有序数据集合 | 键值对映射 | 去重/集合运算 |
最后,我精心筹备了一份全面的Python学习大礼包,完全免费分享给每一位渴望成长、希望突破自我现状却略感迷茫的朋友。无论您是编程新手还是希望深化技能的开发者,都欢迎加入我们的学习之旅,共同交流进步!
🌟 学习大礼包包含内容:
Python全领域学习路线图:一目了然,指引您从基础到进阶,再到专业领域的每一步学习路径,明确各方向的核心知识点。
超百节Python精品视频课程:涵盖Python编程的必备基础知识、高效爬虫技术、以及深入的数据分析技能,让您技能全面升级。
实战案例集锦:精选超过100个实战项目案例,从理论到实践,让您在解决实际问题的过程中,深化理解,提升编程能力。
华为独家Python漫画教程:创新学习方式,以轻松幽默的漫画形式,让您随时随地,利用碎片时间也能高效学习Python。
互联网企业Python面试真题集:精选历年知名互联网企业面试真题,助您提前备战,面试准备更充分,职场晋升更顺利。
👉 立即领取方式:只需【点击这里】,即刻解锁您的Python学习新篇章!让我们携手并进,在编程的海洋里探索无限可能