
本文将介绍如何在python中高效地统计一个字典中嵌套列表的值在另一个目标列表中的总出现次数。针对常见但效率低下的o(n³)嵌套循环方法,文章提出了一种通过预处理目标列表来优化性能的o(n)解决方案,并详细分析其实现原理、代码示例及性能优势。
在Python编程中,我们有时会遇到这样的需求:给定一个字典 my_dict,其键对应的值是一个列表;同时给定一个独立的目标列表 my_list。我们的目标是创建一个新的字典,其中包含 my_dict 的所有键,但对应的值是该键所关联的列表中所有元素在 my_list 中出现的总次数。
例如,考虑以下数据:
my_dict = {'A': ['A', 'B'], 'B': ['C', 'D'], 'C': ['E', 'F']}
my_list = ['A', 'D', 'A', 'C', 'F', 'F']我们期望的输出是 {'A': 2, 'B': 2, 'C': 2}。这是因为:
初学者可能会倾向于使用多层嵌套循环来解决这个问题。一种直观但效率不高的思路是:对于 my_dict 中的每个键及其关联列表,遍历该列表中的每个元素,然后针对每个元素再次遍历 my_list 来统计其出现次数。
这种方法通常会导致极差的性能。具体来说,其时间复杂度会达到 O(N³),其中:
因此,总的迭代次数大致为 K * M * N。在上述示例中,这相当于 3 * 2 * 6 = 36 次基本操作,对于小规模数据尚可接受。但当 K、M、N 变得很大时,O(N³) 的性能会迅速导致程序运行缓慢甚至崩溃。例如,如果 my_list 很大,每次在 my_list 中查找一个元素,都需要遍历 my_list 的大部分内容,这会重复进行大量不必要的计算。
为了显著提升性能,我们可以采用一种预处理策略,将时间复杂度从 O(N³) 降低到 O(N)。核心思想是:首先对 my_list 进行一次遍历,统计其中每个元素的出现次数,并将其存储在一个字典中。由于字典的查找和插入操作平均时间复杂度为 O(1),这使得后续的计数汇总变得极其高效。
下面是使用纯Python实现此优化方案的函数:
Tripo AI
AI驱动的3D建模平台
970
查看详情
def count_nested_values(my_dict: dict, my_list: list) -> dict:
"""
高效统计字典嵌套列表值在目标列表中出现的总次数。
参数:
my_dict (dict): 键为字符串,值为字符串列表的字典。
my_list (list): 包含字符串元素的目标列表。
返回:
dict: 一个新字典,键为my_dict的键,值为对应元素在my_list中出现的总次数。
"""
# 步骤1: 预处理my_list,统计每个元素的出现次数
# 使用字典存储计数,实现O(1)查找
counts = {}
for list_val in my_list:
counts[list_val] = counts.get(list_val, 0) + 1
# 步骤2: 遍历my_dict,根据预处理的counts字典汇总计数
new_dict = {}
for key, associated_list in my_dict.items():
new_dict[key] = 0 # 初始化当前键的总计数
# 遍历与当前键关联的列表中的每个元素
for item_in_associated_list in associated_list:
# 从预处理的counts字典中获取该元素的出现次数
# 使用.get()方法,如果元素不存在于my_list中,则默认为0,避免KeyError
new_dict[key] += counts.get(item_in_associated_list, 0)
return new_dict
# 示例用法
my_dict = {'A': ['A', 'B'], 'B': ['C', 'D'], 'C': ['E', 'F']}
my_list = ['A', 'D', 'A', 'C', 'F', 'F']
result = count_nested_values(my_dict, my_list)
print(result)输出:
{'A': 2, 'B': 2, 'C': 2}让我们详细分析上述优化方案的性能:
步骤1: 预处理 my_list
步骤2: 遍历 my_dict 并汇总计数
综合以上两步,整个算法的整体时间复杂度为 O(N_list + K + N_nested_values)。在最坏情况下,这可以简化为 O(N),其中 N 是输入数据(my_list 长度和 my_dict 中所有元素的总数)的最大规模。
与 O(N³) 的原始方法相比,O(N) 的算法在处理大规模数据时具有压倒性的性能优势。例如,如果 N 为 1000,O(N³) 意味着 10亿次操作,而 O(N) 仅意味着 1000次操作。
以上就是Python高效统计字典嵌套列表值在目标列表中的出现次数的详细内容,更多请关注其它相关文章!
# 值为
# 荥阳教育网站建设
# 网站建设巩义哪家强
# 页游网站如何推广的
# 提升公众号关键词排名
# 玉树抖音seo优化
# 抚顺网站建设联系电话
# 现在如何做网站推广
# 大兴区电子电气网站建设
# 东莞网站推广文案
# 呼伦贝尔整合营销推广
# 是在
# 就会
# python
# 几种
# 浮点
# 键值
# 是一个
# 出现了
# 列表中
# 遍历
# 标准库
# 键值对
# 性能瓶颈
# python编程
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
CSS过渡如何实现按钮悬停效果_transition属性控制背景颜色变化
j*a中赋值运算符是什么?
J*aScript实现下拉菜单驱动的动态表格数据展示
《优志愿》修改手机号方法
4399正版网页版入口高清直达链接
使用Python和GBGB API高效抓取指定日期范围和赛道比赛结果教程
PHP页面重载后变量状态保持:实现用户档案连续浏览的教程
谷歌浏览器如何查找和删除恶意软件 谷歌浏览器内置安全清理工具使用教程
厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项
人教版电子教材在线获取指南
火柴人战争网页版在线玩
使用 J*aScript 随机化 CSS Grid 布局中的元素顺序
视频号视频怎么提取文案?提取的文案如何优化与使用?
苹果17 Pro如何启用分屏浏览_iPhone 17 Pro分屏浏览设置步骤
微博网页版访问入口 微博网页版网页端使用指南
邦丰播放器频道搜索设置
哔哩哔哩的|直播|间怎么送礼物_哔哩哔哩|直播|送礼操作指南
电脑开不了机怎么办 电脑无法开机的解决方法
如何使用CSS Grid实现“大方块左侧,小方块右侧垂直堆叠”的水平布局
J*aScript:从子元素中批量移除特定CSS类
oppo手机如何通过下拉通知栏截图_oppo手机通知栏快捷截图方法
哈尔滨城市通昵称修改方法
poki官网最新入口 poki小游戏大全入口
如何在CSS中实现盒模型多列间距_grid-gap与padding结合
房产|直播|视频号怎么认证开通?|直播|需要什么资质?
免费占卜在线神算_免费占卜手机神算
秋风萧瑟洪波涌起中的萧瑟指的是什么
多闪APP官方下载安装入口_多闪最新版本获取入口
如何用Golang优化微服务间请求性能_Golang 微服务请求性能优化方法
如何快速去除厨房重油污? 2025年最好用的厨房清洁剂推荐
Linux如何开发轻量级数据服务模块_Linux服务化设计
快手网页版官方访问 快手网页版页面在线打开
Python自动化抓取GBGB赛狗比赛结果:日期范围与赛道筛选教程
C++如何使用CMake构建项目_C++ CMakeLists.txt编写入门教程
12306夜间购票失败? | 查看官方公布的暂停服务公告与应对方案
AO3永久镜像入口开放_AO3最新网址兼容所有浏览器
Python模块化编程:避免循环导入与共享函数的最佳实践
如何配置VS Code作为您Git操作的默认编辑器
在VS Code中利用AI辅助进行代码迁移
VS Code快捷键when上下文子句的妙用
Animex动漫社社登录官网 Animex动漫社资源社入口直达
招商淘客入门指南
Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题
盲鳗善于分泌黏液猜猜主要用来做什么
支付宝如何解绑云闪付_支付宝与云闪付账户关联解除方法
德邦快递会员怎么开通
2025SNH48年度青春盛典门票价格及购买方式
《下一站江湖2》心法融合技巧
J*aScript桌面应用_Electron多进程架构实战
从HTML表单获取逗号分隔值并转换为NumPy数组进行预测
2025-11-29
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。