目录文档介绍学习目标第一章 集合的基础认知1.1 集合的核心特性1.2 集合与其他数据类型的对比1.3 集合的适用场景第二章 集合的创建2.1 直接创建集合花括号{}2.2 使用set()函数创建2.3 关键注意事项第三章 集合的基本操作3.1 添加元素3.1.1 add()添加单个元素3.1.2 update()添加多个元素3.2 删除元素3.2.1 remove()删除指定元素3.2.2 discard()删除指定元素安全3.2.3 pop()随机删除并返回元素3.2.4 clear()清空集合3.3 查询元素成员关系判断3.4 遍历集合第四章 集合的核心数学运算4.1 交集Intersection4.2 并集Union4.3 差集Difference4.4 对称差集Symmetric Difference4.5 子集与超集判断第五章 集合的高级应用5.1 集合推导式5.2 不可变集合frozenset第六章 集合使用的常见误区与注意事项6.1 常见误区6.2 注意事项第七章 实战案例案例1数据去重案例2成员关系快速判断案例3集合运算实战总结文档介绍Python 中的集合Set是一种无序、可变的序列数据类型其核心特性是元素唯一不允许出现重复值。集合基于哈希表实现支持交集、并集、差集等数学集合运算是处理数据去重、成员关系判断、集合运算的高效工具。本教程从基础认知到高级应用全面讲解集合的语法、特性、操作及实战场景适合Python初学者及需要巩固集合知识的开发者学习。学习目标掌握集合的核心特性与创建方式熟练运用集合的增、删、查、遍历操作精通集合的数学运算交集、并集、差集等理解集合推导式、不可变集合frozenset的应用规避集合使用的常见误区解决实际业务问题第一章 集合的基础认知1.1 集合的核心特性集合与列表list、元组tuple、字典dict相比有三大独特属性特性说明元素唯一自动去重同一集合中不存在重复元素是数据去重的首选工具。无序性集合中的元素没有固定顺序不支持索引、切片操作与列表/元组的核心区别。可变性集合本身可增删元素但元素必须是不可变类型如整数、字符串、元组。1.2 集合与其他数据类型的对比为了更清晰理解集合我们将其与常用数据类型对比数据类型是否有序是否可变元素是否可重复元素类型要求核心用途列表list是是是任意类型存储有序序列、增删改查元组tuple是否是任意类型存储不可变有序序列字典dict否3.7有序是键唯一、值可重复键必须不可变值任意存储键值对映射集合set否是否自动去重必须不可变类型数据去重、集合运算1.3 集合的适用场景数据去重快速去除列表、元组中的重复元素成员关系判断判断某个元素是否在集合中效率远高于列表集合运算实现数学中的交集、并集、差集、子集判断等逻辑高效存储哈希表实现的集合查询、插入、删除的时间复杂度均为O(1)第二章 集合的创建集合的创建主要有两种方式直接用花括号{}和使用set()函数需注意空集合的创建细节。2.1 直接创建集合花括号{}语法集合名 {元素1, 元素2, 元素3, ...}元素必须是不可变类型int、float、str、tuple、bool等不能是list、dict、set等可变类型自动去重重复元素会被自动剔除示例代码# 1. 创建空集合错误示范 empty_set {} # 这是**空字典**不是空集合 print(type(empty_set)) # 输出class dict # 2. 创建非空集合 # 元素为整数、字符串、元组不可变类型 num_set {1, 2, 3, 4, 4, 5} # 自动去重重复的4被剔除 str_set {Python, Java, Python} tuple_set {(1, 2), (3, 4), (1, 2)} # 元组是不可变类型可作为集合元素 # 3. 错误示例元素包含可变类型列表 # error_set {1, 2, [3, 4]} # 报错TypeError: unhashable type: list # 输出集合 print(num_set:, num_set) # 输出{1, 2, 3, 4, 5}无序顺序可能不同 print(str_set:, str_set) # 输出{Python, Java} print(tuple_set:, tuple_set) # 输出{(1, 2), (3, 4)}2.2 使用set()函数创建set()函数可将可迭代对象列表、元组、字符串、range等转换为集合同样会自动去重。语法集合名 set(可迭代对象)示例代码# 1. 从列表创建集合自动去重 list1 [1, 2, 2, 3, 4, 4] set1 set(list1) print(set1:, set1) # 输出{1, 2, 3, 4} # 2. 从字符串创建集合按字符拆分去重 str1 hello set2 set(str1) print(set2:, set2) # 输出{h, e, l, o}l重复仅保留一个 # 3. 从元组创建集合 tuple1 (5, 6, 6, 7) set3 set(tuple1) print(set3:, set3) # 输出{5, 6, 7} # 4. 创建空集合正确方式 empty_set set() print(type(empty_set)) # 输出class set2.3 关键注意事项空集合必须用set()创建{}是空字典不是空集合元素必须可哈希集合元素需满足“可哈希”不可变否则会触发TypeError集合无序输出顺序与创建顺序无关不能通过索引访问元素如num_set[0]会报错第三章 集合的基本操作集合是可变的支持添加元素、删除元素、查询元素、遍历集合等基本操作以下逐一讲解。3.1 添加元素集合提供两种添加元素的方法add()添加单个元素和update()添加多个元素。3.1.1 add()添加单个元素语法集合.add(元素)元素必须是不可变类型若元素已存在不执行任何操作自动去重示例代码# 创建空集合 num_set set() # 添加单个整数 num_set.add(1) num_set.add(2) print(添加1、2后:, num_set) # 输出{1, 2} # 添加重复元素无效果 num_set.add(1) print(添加重复元素1后:, num_set) # 输出{1, 2} # 添加不可变类型元素元组 num_set.add((3, 4)) print(添加元组后:, num_set) # 输出{1, 2, (3, 4)} # 错误添加可变类型元素列表 # num_set.add([5, 6]) # 报错TypeError: unhashable type: list3.1.2 update()添加多个元素语法集合.update(可迭代对象)参数必须是可迭代对象列表、元组、字符串、集合等会将可迭代对象的每个元素逐一添加到集合中自动去重示例代码num_set {1, 2} # 1. 从列表添加多个元素 num_set.update([3, 4, 4]) # 列表中的4会被去重 print(从列表添加后:, num_set) # 输出{1, 2, 3, 4} # 2. 从字符串添加多个元素按字符拆分 num_set.update(56) print(从字符串添加后:, num_set) # 输出{1, 2, 3, 4, 5, 6} # 3. 从集合添加多个元素 num_set.update({7, 8}) print(从集合添加后:, num_set) # 输出{1, 2, 3, 4, 5, 6, 7, 8}3.2 删除元素集合的删除操作有四种方法remove()、discard()、pop()、clear()需注意各自的差异。3.2.1 remove()删除指定元素语法集合.remove(元素)若元素不存在会直接抛出KeyError异常必须指定要删除的元素无返回值示例代码num_set {1, 2, 3, 4} # 1. 删除存在的元素 num_set.remove(2) print(删除2后:, num_set) # 输出{1, 3, 4} # 2. 删除不存在的元素报错 # num_set.remove(5) # 报错KeyError: 53.2.2 discard()删除指定元素安全语法集合.discard(元素)若元素不存在不会报错直接忽略操作相比remove()更安全适合不确定元素是否存在的场景示例代码num_set {1, 2, 3, 4} # 1. 删除存在的元素 num_set.discard(3) print(删除3后:, num_set) # 输出{1, 2, 4} # 2. 删除不存在的元素无报错 num_set.discard(5) print(删除不存在的5后:, num_set) # 输出{1, 2, 4}3.2.3 pop()随机删除并返回元素语法集合.pop()集合是无序的因此pop()会随机删除并返回集合中的一个元素若集合为空会抛出KeyError异常示例代码num_set {1, 2, 3, 4} # 随机删除并返回元素 deleted_elem num_set.pop() print(随机删除的元素:, deleted_elem) # 输出1或其他元素随机 print(删除后集合:, num_set) # 输出{2, 3, 4}或其他剩余元素 # 空集合调用pop()报错 # empty_set set() # empty_set.pop() # 报错KeyError: pop from an empty set3.2.4 clear()清空集合语法集合.clear()无参数、无返回值直接清空集合中的所有元素集合变为空集合但集合对象仍存在示例代码num_set {1, 2, 3, 4} # 清空集合 num_set.clear() print(清空后集合:, num_set) # 输出set() print(集合类型:, type(num_set)) # 输出class set3.3 查询元素成员关系判断集合不支持索引访问因此判断元素是否存在是核心查询操作使用in和not in关键字。语法元素 in 集合若元素存在返回True否则返回False元素 not in 集合若元素不存在返回True否则返回False示例代码num_set {1, 2, 3, 4} # 1. 判断元素存在 print(2 in num_set) # 输出True print(5 in num_set) # 输出False # 2. 判断元素不存在 print(5 not in num_set) # 输出True print(2 not in num_set) # 输出False # 3. 结合条件语句使用 if 3 in num_set: print(3在集合中执行删除操作) num_set.remove(3) print(删除3后:, num_set) # 输出{1, 2, 4}3.4 遍历集合由于集合无序遍历只能通过for循环实现无法通过索引遍历。语法for 元素 in 集合: 操作元素示例代码num_set {1, 2, 3, 4, 5} # 1. 基础遍历 print(集合元素遍历:) for num in num_set: print(num, end ) # 输出1 2 3 4 5顺序可能不同 # 2. 遍历并处理元素 print(\n遍历并计算平方:) for num in num_set: print(f{num}的平方是{num**2}, end | ) # 输出1的平方是1 | 2的平方是4 | ...第四章 集合的核心数学运算集合的核心价值在于支持数学集合运算Python提供了运算符和方法两种实现方式功能完全一致仅语法不同。4.1 交集Intersection交集表示两个集合中共同存在的元素用运算符或intersection()方法实现。语法与示例运算符集合1 集合2返回新集合不修改原集合方法集合1.intersection(集合2)返回新集合不修改原集合# 定义两个集合 set_a {1, 2, 3, 4} set_b {3, 4, 5, 6} # 用运算符求交集 intersection1 set_a set_b print(运算符求交集:, intersection1) # 输出{3, 4} # 用方法求交集 intersection2 set_a.intersection(set_b) print(方法求交集:, intersection2) # 输出{3, 4} # 原集合不变 print(原set_a:, set_a) # 输出{1, 2, 3, 4} print(原set_b:, set_b) # 输出{3, 4, 5, 6}4.2 并集Union并集表示两个集合中所有的元素去重后用|运算符或union()方法实现。语法与示例运算符集合1 | 集合2返回新集合不修改原集合方法集合1.union(集合2)返回新集合不修改原集合set_a {1, 2, 3, 4} set_b {3, 4, 5, 6} # 运算符求并集 union1 set_a | set_b print(运算符求并集:, union1) # 输出{1, 2, 3, 4, 5, 6} # 方法求并集 union2 set_a.union(set_b) print(方法求并集:, union2) # 输出{1, 2, 3, 4, 5, 6}4.3 差集Difference差集表示集合1中存在、但集合2中不存在的元素用-运算符或difference()方法实现顺序影响结果。语法与示例运算符集合1 - 集合2返回新集合不修改原集合方法集合1.difference(集合2)返回新集合不修改原集合set_a {1, 2, 3, 4} set_b {3, 4, 5, 6} # 集合a - 集合ba有、b没有 diff1 set_a - set_b print(set_a - set_b:, diff1) # 输出{1, 2} # 集合b - 集合ab有、a没有 diff2 set_b - set_a print(set_b - set_a:, diff2) # 输出{5, 6} # 方法实现 diff3 set_a.difference(set_b) print(方法实现差集:, diff3) # 输出{1, 2}4.4 对称差集Symmetric Difference对称差集表示两个集合中互不相同的元素即并集减去交集用^运算符或symmetric_difference()方法实现。语法与示例运算符集合1 ^ 集合2返回新集合不修改原集合方法集合1.symmetric_difference(集合2)返回新集合不修改原集合set_a {1, 2, 3, 4} set_b {3, 4, 5, 6} # 运算符求对称差集 sym_diff1 set_a ^ set_b print(运算符求对称差集:, sym_diff1) # 输出{1, 2, 5, 6} # 方法求对称差集 sym_diff2 set_a.symmetric_difference(set_b) print(方法求对称差集:, sym_diff2) # 输出{1, 2, 5, 6} # 等价于并集 - 交集 sym_diff3 (set_a | set_b) - (set_a set_b) print(等价运算结果:, sym_diff3) # 输出{1, 2, 5, 6}4.5 子集与超集判断若集合1的所有元素都在集合2中则集合1是集合2的子集集合2是集合1的超集用子集、超集运算符或对应方法实现。核心语法子集集合1 集合2或集合1.issubset(集合2)真子集集合1≠集合2集合1 集合2超集集合1 集合2或集合1.issuperset(集合2)真超集集合1≠集合2集合1 集合2set1 {1, 2, 3} set2 {1, 2, 3, 4, 5} set3 {1, 2, 3} # 子集判断 print(set1是set2的子集?, set1 set2) # 输出True print(set1是set2的真子集?, set1 set2) # 输出True print(set1是set3的子集?, set1.issubset(set3)) # 输出True print(set1是set3的真子集?, set1 set3) # 输出False两集合相等 # 超集判断 print(set2是set1的超集?, set2 set1) # 输出True print(set2是set1的真超集?, set2 set1) # 输出True print(set3是set1的超集?, set3.issuperset(set1)) # 输出True第五章 集合的高级应用5.1 集合推导式集合推导式与列表推导式类似用于快速创建集合语法更简洁且自动去重。语法{表达式 for 变量 in 可迭代对象 if 条件}示例代码# 1. 基础推导式创建1-10的偶数集合 even_set {x for x in range(1, 11) if x % 2 0} print(偶数集合:, even_set) # 输出{2, 4, 6, 8, 10} # 2. 去重功能从列表中去重并筛选 list1 [1, 2, 2, 3, 4, 4, 5] unique_set {x for x in list1 if x 2} print(去重筛选后:, unique_set) # 输出{3, 4, 5} # 3. 复杂表达式计算平方并去重 num_list [1, 2, 2, 3, 3, 4] square_set {x**2 for x in num_list} print(平方集合:, square_set) # 输出{1, 4, 9, 16}5.2 不可变集合frozenset普通集合set是可变的不能作为字典的键、也不能作为其他集合的元素而不可变集合frozenset是不可变的支持除增删外的所有集合操作可作为字典键和集合元素。创建方式frozenset(可迭代对象)示例代码# 创建不可变集合 f_set frozenset({1, 2, 3, 4}) print(不可变集合:, f_set) # 输出frozenset({1, 2, 3, 4}) print(类型:, type(f_set)) # 输出class frozenset # 不可变集合不能增删元素报错 # f_set.add(5) # 报错AttributeError: frozenset object has no attribute add # f_set.remove(1) # 报错AttributeError: frozenset object has no attribute remove # 可进行集合运算 set1 {3, 4, 5} print(交集:, f_set set1) # 输出{3, 4} # 可作为字典的键 dict1 {f_set: 不可变集合作为键} print(dict1) # 输出{frozenset({1, 2, 3, 4}): 不可变集合作为键} # 可作为其他集合的元素 set2 {f_set, 5, 6} print(包含不可变集合的集合:, set2) # 输出{5, 6, frozenset({1, 2, 3, 4})}第六章 集合使用的常见误区与注意事项6.1 常见误区误区1用{}创建空集合{}创建的是空字典空集合必须用set()创建。误区2集合支持索引访问集合是无序的不支持集合[0]这种索引操作会抛出TypeError。误区3集合元素可以是任意类型集合元素必须是不可变类型可哈希不能是列表、字典、普通集合等可变类型。误区4集合运算会修改原集合大部分集合运算、|、-、^和对应方法intersection、union等会返回新集合不会修改原集合。6.2 注意事项集合的无序性输出顺序与创建顺序无关不同环境下输出顺序可能不同属于正常现象。效率对比集合的成员关系判断in效率远高于列表数据量越大优势越明显列表时间复杂度O(n)集合O(1)。不可变集合的使用场景当需要将集合作为字典键或其他集合元素时必须使用frozenset。空集合判断判断集合是否为空用if not 集合名而非if 集合名 []或if 集合名 {}。第七章 实战案例案例1数据去重需求去除列表中的重复元素保留唯一值并返回新列表。# 原始列表含重复元素 student_ids [101, 102, 103, 102, 104, 101, 105, 103] # 方法1用set去重再转换为列表 unique_ids1 list(set(student_ids)) print(去重后无序:, unique_ids1) # 输出[101, 102, 103, 104, 105]顺序可能不同 # 方法2去重并保留原顺序Python 3.7 unique_ids2 list(dict.fromkeys(student_ids)) print(去重后保序:, unique_ids2) # 输出[101, 102, 103, 104, 105]案例2成员关系快速判断需求判断某个学生ID是否在已注册列表中列表长度为10000要求高效判断。import random # 生成10000个随机学生ID可能重复 random_ids [random.randint(1000, 9999) for _ in range(10000)] # 转换为集合提升查询效率 id_set set(random_ids) # 判断目标ID是否存在 target_id 5678 if target_id in id_set: print(fID {target_id} 已注册) else: print(fID {target_id} 未注册)案例3集合运算实战需求已知两个班级的学生姓名求两个班级的共同学生、所有学生、仅在A班的学生。# A班和B班学生姓名 class_a {张三, 李四, 王五, 赵六} class_b {王五, 赵六, 孙七, 周八} # 共同学生交集 common_students class_a class_b print(两个班级共同学生:, common_students) # 输出{王五, 赵六} # 所有学生并集 all_students class_a | class_b print(两个班级所有学生:, all_students) # 输出{张三, 李四, 王五, 赵六, 孙七, 周八} # 仅在A班的学生差集 only_a class_a - class_b print(仅在A班的学生:, only_a) # 输出{张三, 李四}总结Python集合是一种高效、实用的数据类型核心优势在于元素唯一、无序、支持集合运算适用于数据去重、成员关系判断、集合逻辑运算等场景。本教程重点讲解了集合的基础特性、创建方式、基本操作、数学运算、高级应用及实战案例掌握这些内容后可灵活运用集合解决实际开发中的问题。需注意区分普通集合与不可变集合的使用场景规避常见误区充分发挥集合的高效性。