【Python 集合 Set 】全面学习指南

📚 Python 集合(Set)全面学习指南

集合(Set)是 Python 中用于存储唯一元素无序的数据结构,支持高效的成员检测和集合运算(交集、并集等)。系统性知识整理,涵盖基础操作、高级技巧和实际应用。


一、集合基础

1. 创建集合
python 复制代码
# 创建空集合(必须使用 set(),{} 创建的是空字典)
empty_set = set()

# 直接定义集合
numbers = {1, 2, 3, 4, 5}  
letters = set("hello")      # {'h', 'e', 'l', 'o'}

# 从列表去重生成集合
data = [2, 3, 2, 5, 3]
unique_data = set(data)     # {2, 3, 5}

二、集合操作与方法

1. 增删元素
方法 功能 示例
add(x) 添加单个元素 numbers.add(6) → {1,2,3,4,5,6}
update(iter) 合并可迭代对象的元素 numbers.update([7,8])
remove(x) 删除元素(不存在时报错) numbers.remove(3)
discard(x) 安全删除元素(不报错) numbers.discard(10)
pop() 随机删除并返回一个元素 element = numbers.pop()
clear() 清空集合 numbers.clear()

2. 集合运算
操作 符号 方法 示例
并集 (Union) ` ` union()
交集 (Intersection) & intersection() a & ba.intersection(b)
差集 (Difference) - difference() a - ba.difference(b)
对称差集 (Symmetric) ^ symmetric_difference() a ^ ba.symmetric_difference(b)
python 复制代码
a = {1, 2, 3}
b = {3, 4, 5}

print(a | b)   # {1, 2, 3, 4, 5}
print(a & b)   # {3}
print(a - b)   # {1, 2}
print(a ^ b)   # {1, 2, 4, 5}

3. 关系判断
方法 功能 示例
issubset() 判断是否为子集 a.issubset(b)
issuperset() 判断是否为超集 a.issuperset(b)
isdisjoint() 判断是否无交集 a.isdisjoint(b)
python 复制代码
a = {1, 2}
b = {1, 2, 3}
print(a.issubset(b))      # True
print(b.issuperset(a))    # True

三、高级特性与技巧

1. 集合推导式
python 复制代码
# 生成唯一平方数集合
squares = {x**2 for x in [1, -1, 2, -2, 3]}  # {1, 4, 9}

# 过滤偶数
numbers = {1, 2, 3, 4, 5}
even = {x for x in numbers if x % 2 == 0}    # {2, 4}

2. 不可变集合 frozenset
python 复制代码
# 创建不可变集合
fs = frozenset([1, 2, 3])

# 作为字典的键或集合的元素
valid_keys = {fs: "value"}
nested_set = {fs, frozenset([4, 5])}

3. 性能优势
  • 成员检测 x in set: O(1) 时间复杂度
    (列表为 O(n))
  • 去重效率:集合比遍历列表检测重复更快。
python 复制代码
# 列表 vs 集合成员检测速度对比
from timeit import timeit

list_time = timeit("1000000 in lst", setup="lst = list(range(1000000))", number=100)
set_time = timeit("1000000 in s", setup="s = set(range(1000000))", number=100)

print(f"列表检测时间: {list_time:.6f}s")
print(f"集合检测时间: {set_time:.6f}s")

四、实际应用案例

1. 数据去重
python 复制代码
# 快速去重并保留顺序
def deduplicate_ordered(lst):
    seen = set()
    return [x for x in lst if not (x in seen or seen.add(x))]

data = [2, 3, 2, 5, 3]
print(deduplicate_ordered(data))  # [2, 3, 5]

2. 共同兴趣发现
python 复制代码
# 找出多个用户的共同兴趣
user1 = {"音乐", "电影", "读书"}
user2 = {"读书", "旅行", "美食"}
user3 = {"电影", "读书", "游戏"}

common_interests = user1 & user2 & user3
print(common_interests)  # {'读书'}

3. 权限管理系统
python 复制代码
# 检查用户权限
required_permissions = {"read", "write"}
user_permissions = {"read", "execute"}

if required_permissions.issubset(user_permissions):
    print("权限足够")
else:
    missing = required_permissions - user_permissions
    print(f"缺少权限: {missing}")  # 输出: 缺少权限: {'write'}

五、常见问题与误区

1. 空集合的创建
  • 错误用法 : empty_set = {} → 创建的是空字典
  • 正确用法 : empty_set = set()

2. 集合中元素的类型限制
  • 集合只能包含不可变(hashable)类型(如数字、字符串、元组)。

  • 非法操作 :

    python 复制代码
    invalid_set = {[1, 2], 3}  # 报错:列表是可变类型

3. 集合无序性带来的问题
python 复制代码
s = {3, 1, 2}
print(s)  # 输出顺序不确定(如 {1, 2, 3} 或 {3, 1, 2})

六、总结

场景 推荐数据结构 原因
需要唯一元素 集合 (set) 自动去重,高效成员检测
保持插入顺序 列表 (list) 集合是无序的
键值对存储 字典 (dict) 集合不存储键值对

掌握集合的用法后,可显著优化需要去重或集合运算的代码逻辑!

相关推荐
君莫笑几人回6 分钟前
关于记录一下“bug”,在做图片上传的时候出现的小问题
java·开发语言·spring boot
rockmelodies32 分钟前
RSA 解密逻辑
开发语言·python
澡点睡觉1 小时前
golang的包和闭包
开发语言·后端·golang
Tobiichiorigami.1 小时前
Python训练Day30
python
Dxy12393102162 小时前
python创建一个excel文件
开发语言·python·excel
朝朝又沐沐2 小时前
算法竞赛阶段二-数据结构(40)数据结构栈的STL
开发语言·数据结构·c++·算法
比特森林探险记2 小时前
Go语言常用的设计模式
开发语言·设计模式·golang
深海潜水员3 小时前
【Unity】背包系统 + 物品管理窗口 (上)
开发语言·vscode·游戏·unity·c#·游戏引擎
德育处主任Pro4 小时前
p5.js 用 beginGeometry () 和 endGeometry () 打造自定义 3D 模型
开发语言·javascript·3d