当前位置: 首页 > news >正文

Python集合与冻结集合高级

Python集合与冻结集合高级
==============================

一、frozenset作为字典键
frozenset是不可变的哈希集合,可以作为字典的键或集合的元素,
而普通set则不行。

# frozenset作为字典键
路由表 = {
frozenset({"北京", "上海"}): "京沪线",
frozenset({"广州", "深圳"}): "广深线",
frozenset({"成都", "重庆"}): "成渝线",
}

def 查询路线(城市1: str, 城市2: str) -> str:
"""根据两个城市查询路线名称"""
路线键 = frozenset({城市1, 城市2})
return 路由表.get(路线键, "未知路线")

print(f"路线: {查询路线('北京', '上海')}")
print(f"路线: {查询路线('上海', '北京')}") # 顺序无关

# frozenset作为集合的元素
用户权限组 = {
frozenset({"读取", "写入"}), # 普通用户
frozenset({"读取", "写入", "删除"}), # 管理员
frozenset({"读取"}), # 只读用户
}
print(f"权限组数量: {len(用户权限组)}")

# 检查权限组合是否存在
def 检查权限组合(*权限):
return frozenset(权限) in 用户权限组

print(f"读写权限存在: {检查权限组合('读取', '写入')}")

二、集合/字典视图对象
keys()、values()、items()返回的是动态视图,反映底层dict的变化。

配置 = {"主机": "localhost", "端口": 8080, "调试": True}

# 创建视图
键视图 = 配置.keys()
值视图 = 配置.values()
项视图 = 配置.items()

print(f"键视图: {list(键视图)}")

# 修改原字典,视图自动更新
配置["超时"] = 30
配置["主机"] = "192.168.1.1"

print(f"更新后键视图: {list(键视图)}") # 包含新键
print(f"值视图: {list(值视图)}")

# 视图支持集合运算(键视图和项视图)
其他配置 = {"主机": "10.0.0.1", "端口": 9090, "协议": "https"}

交集键 = 配置.keys() & 其他配置.keys()
差集键 = 配置.keys() - 其他配置.keys()
并集键 = 配置.keys() | 其他配置.keys()

print(f"共同的键: {交集键}")
print(f"独有的键: {差集键}")
print(f"所有键: {并集键}")

三、集合运算链式调用
集合的union、intersection等方法可以链式调用,返回新集合。

基础用户 = {"张三", "李四", "王五"}
VIP用户 = {"李四", "赵六", "钱七"}
管理员 = {"王五", "孙八"}
黑名单 = {"赵六"}

# 链式集合运算:找出所有可发送通知的用户
可通知用户 = (基础用户 | VIP用户) - 黑名单
print(f"可通知用户: {可通知用户}")

# 复杂的集合运算链
结果 = 基础用户.intersection(VIP用户).union(管理员).difference(黑名单)
print(f"链式结果: {结果}")

# |=, &=, -=, ^= 原地操作
会话权限 = {"读取", "写入"}
会话权限 |= {"删除"} # 添加权限
print(f"更新后权限: {会话权限}")

四、集合推导式性能优化
集合推导式比循环add方式更快,内部有优化。

import time

def 对比集合构建方式():
"""对比集合推导式和循环add的性能"""
数据量 = 100000

# 使用集合推导式
开始 = time.perf_counter()
集合1 = {i % 5000 for i in range(数据量)}
推导式耗时 = time.perf_counter() - 开始

# 使用for循环add
开始 = time.perf_counter()
集合2 = set()
for i in range(数据量):
集合2.add(i % 5000)
循环耗时 = time.perf_counter() - 开始

print(f"集合推导式: {推导式耗时:.4f}s")
print(f"循环add: {循环耗时:.4f}s")
print(f"推导式快 {循环耗时/推导式耗时:.2f} 倍")

对比集合构建方式()

# 带条件的集合推导式
偶数平方集合 = {x ** 2 for x in range(20) if x % 2 == 0}
print(f"偶数平方集合: {偶数平方集合}")

五、__contains__与in操作符
集合的__contains__方法使用哈希表实现,时间复杂度为O(1)。

def 成员检测性能对比():
"""对比列表和集合的成员检测性能"""
数据量 = 100000
测试集 = set(range(数据量))
测试列表 = list(range(数据量))

# 集合成员检测
开始 = time.perf_counter()
for i in range(10000):
_ = i in 测试集
集合耗时 = time.perf_counter() - 开始

# 列表成员检测
开始 = time.perf_counter()
for i in range(10000):
_ = i in 测试列表
列表耗时 = time.perf_counter() - 开始

print(f"集合__contains__: {集合耗时:.4f}s")
print(f"列表__contains__: {列表耗时:.4f}s")
print(f"集合快 {列表耗时/集合耗时:.0f} 倍")

成员检测性能对比()

六、frozenset的高级应用:缓存与去重

def 生成缓存键(*args, **kwargs):
"""为函数参数生成可哈希的缓存键"""
位置键 = frozenset(args) if len(args) > 1 else args
关键字键 = frozenset(kwargs.items())
return (位置键, 关键字键)

# 使用frozenset做函数结果缓存
from functools import lru_cache

@lru_cache(maxsize=128)
def 统计字频(文本: str, 忽略字符: frozenset = frozenset()):
"""统计文本中字符出现频率"""
频率 = {}
for 字符 in 文本:
if 字符 not in 忽略字符:
频率[字符] = 频率.get(字符, 0) + 1
return 频率

文本 = "hello world"
标点 = frozenset({',', '.', '!', '?'})
结果1 = 统计字频(文本, 标点)
结果2 = 统计字频(文本) # 不带忽略字符
print(f"字频(忽略标点): {结果1}")

七、小结
frozenset作为可哈希的不可变集合,在字典键、集合元素、
缓存键等场景中表现出色。视图对象的动态特性与集合运算
的结合,为字典操作提供了函数式风格的支持。理解这些高级
特性可以写出更高效、更优雅的Python代码。

http://www.rkmt.cn/news/1436662.html

相关文章:

  • 基于TCN结合Attention机制的时间序列预测:从数据预处理到模型评估,MATLAB 搭建
  • Gemini股东大会材料中被忽略的3个技术条款,正悄然重构API收费模型与开发者分成机制
  • 2026 年机器人快换盘与快枪盘对比推荐 末端快换源头厂家实测 - GrowthUME
  • LinuxCNC开源数控系统:7个关键突破与实战配置指南
  • 硕士论文定稿降重:适配知网语义查重,5 款实测好用的避检降重软件全解析
  • AI视频生成性能天花板在哪?实测12个主流模型:帧率、时序一致性、长程逻辑连贯性三维权威 benchmark
  • 2026年AI论文写作工具实测精选:5款神器从选题到格式全流程护航
  • Markitdown 文档解析效果实测与能力边界
  • 刘诗诗压轴亮相VOGUE盛典,化身森中花仙子掀头纱封神!
  • Arduino LED动画编程:从基础流水灯到进阶交互控制
  • 2026年Markdown转Word的4种高效方法,保姆级教程一看就会
  • LangChain4j 开发Java Agent智能体- HelloWorld 实现
  • 论文写作的开挂模式!专业AI论文平台,成稿速度超迅速
  • 你的社交媒体记忆真的安全吗?这款高效工具帮你一键永久保存
  • 有没有一款降重软件能保留专业术语和公式?求推荐(理工科论文避雷指南)
  • 别再走弯路!2026实测靠谱的AI写作辅助平台|省心版
  • Buzz:本地化语音转录的技术实现与架构解析
  • 主流AI写作辅助网站势力榜(2026 深度测评)
  • 如何打造你的数字记忆银行?WeChatMsg免费开源方案重塑数据主权
  • 联想刃7000K BIOS隐藏选项终极解锁指南:3分钟释放完整硬件潜能
  • yolov8多任务模型+目标检测+车道线检测+可行驶区域检测-yolo多检测头代码+教程
  • 【Gemini短信营销文案黄金公式】:20年实战验证的5大高转化结构+3个避坑红线
  • 5.31 上海黄金回收正规门店对比+避坑指南 - 速递信息
  • Gemini故事创作瓶颈突破指南:基于278个真实案例的失败归因矩阵(限免72小时)
  • 基于Arduino的物理专注力计时器:从硬件约束到心流状态
  • 今天不配置Gemini社媒工作流,明天你的KOC合作成本将上涨210%
  • 5.31 芜湖黄金回收|皖江枢纽实测 避坑 + 正规榜单 - 速递信息
  • 陕西连锁零售行业怎么做 GEO 优化科普:3 分钟看懂连锁零售 GEO 优化核心逻辑 - 新闻快讯
  • 从群接单到平台化运营:游戏电竞护航陪玩源码系统小程序 - 壹软科技
  • 如何永久保存微信聊天记录:从数据丢失焦虑到数字记忆守护