Python Cookbook-4.13 获取字典的一个子集

任务

你有一个巨大的字典,字典中的一些键属于一个特定的集合,而你想创建一个包含这个键集合及其对应值的新字典。

解决方案

如果你不想改动原字典:

def sub_dict(somedict,somekeys,default = None):return dict([(k, somedict.get(k,default)) for k in somekeys ])

如果你从原字典中删除那些符合条件的条目:

def sub_dict_remove(somedict,somekeys,default = None):return dict([ (k, somedict.pop(k,default)) for k in somekeys ])

下面是两个函数的使用和效果:

>>>d = {'a':5,'b':6,'c':7}
>>>print sub_dict(d,'ab'),d
{'a':5,'b':6}{'a':5,'b':6,'c': 7}
>>> print sub_dict_remove(d,'ab'),d
{'a':5,'b':6}{'c':7}

讨论

在 Python 中,我在很多地方都用到了字典——数据库的行、主键和复合键,用于模板解析的变量名字空间等。我常常需要基于另外一个已有的大字典创建一个新字典,此字典的键是大字典的键的一个子集。在大多数情况下,原字典应该保持不变;但有时,我也需要在完成了抽取之后删除在原字典中的子集。本节的解决方案对两种可能性都给出了答案。区别仅仅在于,如果需要原字典保持原样不变,使用get方法,如果需要删除子集,则使用 pop 方法。

如果 somekeys 中的某元素k并不是 somedict的键,解决方案提供的函数会将k作为结果的键,并对应一个默认值(可以作为一个可选的参数传递给这两个函数,默认情况下是 None)。所以,最终结果也不一定是somedict 的子集。不过我却发现这种行为方式对我的应用非常有帮助。

当你认为 somekeys中的所有的元素都应当是 somedict 的键时,也许会希望在键“缺失的时候获得一个异常,它可以提示和警告你程序中的bug。记住,Tim Peters 在 The Zeno/Python 中说过“错误不应该被静静地略过,除非有意为之”(在 Python 的交互式解释器的提示符下敲入 import this 并回车,你将看到精炼的 Python 设计原则)。所以,如果从你的应用的角度看,键不匹配是一个错误,那么会希望马上得到一个异常来提醒你错误的发生。如果这的确是你所希望的,可以对解决方案中的函数略作修改:

def sub_dict_strict(somedict,somekeys):return dict([ (k,somedict[k]) for k in somekeys ])
def sub_dict_remove_strict(somedict,somekeys):return dict([ (k,somedict.pop(k)) for k in somekeys ])

这些更加严格的变体版本甚至比原版本更简单——这充分说明了Python 本来就喜欢在意外发生时抛出异常。
或者,你希望在键不匹配时直接将其忽略。这也只需要一点点修改:

def sub_dict_select(somedict,somekeys):return dict([ (k,somedict[k[) for k in somekeys if k in somedict])
def sub_dict_remove_select(somedict,somekeys):return dict([ (k,somedict,pop(k)) for k in somekeys if k in somedict))

列表推导中的if子句做完了我们期望的事,即在应用k之前先做鉴别工作。

在 Python 2.4中可以用生成器表达式来替代列表推导,用它作为本节中的函数的参数。我们只需略微修改 dict 的调用,将 dict([…])改成 dict(…)(移除临近圆括号的方括号),就能享受进一步的简化和速度的提升。不过这些修改不适用 Python2.3,因为它只支持列表推导而不支持生成器表达式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware Ubuntu 网络配置全攻略:从断网到畅通无阻

一、网络连接模式选择(先搞懂原理) VMware提供三种网络模式,就像手机的不同网络套餐: 模式适用场景特点类比NAT个人上网/新手首选虚拟机共享主机IP,能上网但隐身家用WiFi桥接服务器/需要被局域网访问虚拟机会获得独立…

链表(C++)

这是本人第二次学习链表,第一次学习链表是在大一上的C语言课上,首次接触,感到有些难;第二次是在大一下学习数据结构时(就是这次),使用C再次理解链表。同时,这也是开启数据结构学习写…

【SPP】蓝牙串口协议应用层深度解析:从连接建立到实战开发

目录 一、SPP应用层协议框架与角色模型 1.1 分层协议栈模型 1.2 设备角色模型(DevA 与 DevB 交互) 二、连接建立流程:从 SDP 到 RFCOMM 2.1 服务发现(SDP)流程(SDP 记录关键参数) 2.2 连接…

Giteki 认证:无线产品进入日本市场的关键保障

目录 适用产品认证范围 认证项目及技术要求 认证流程 认证周期 与其他认证的对比 常见问题 注意事项 Giteki 认证,其名称来源于日本语 “技適マーク”,罗马字拼写为 “GITEKI” ,在行业内也常被称为 Telec 认证、MIC 认证、RF 认证或技…

Ubuntu24.04 配置远程桌面服务

一:安装 sudo apt update sudo apt install vino 二:设置 gsettings set org.gnome.Vino require-encryption false # 关闭加密(某些 VNC 客户端不支持加密) gsettings set org.gnome.Vino prompt-enabled false # 关闭连接…

人工智能与软件工程结合的发展趋势

AI与软件工程的结合正在深刻改变软件开发的流程、工具和方法,其发展方向涵盖了从代码生成到系统维护的整个生命周期。以下是主要的发展方向和技术趋势: 1. 软件架构体系的重构 从“面向过程”到“面向目标”的架构转型: AI驱动软件设计以目标…

转发和重定向的区别详解

转发(Forward)和重定向(Redirect)是 Web 开发中两种常用的请求处理方式,主要用于将客户端请求从一个资源转移到另一个资源。它们在实现机制、行为表现和应用场景上有显著区别,以下是对两者的详细解析&#…

python专题1-----判断一个变量是否是字符串类型

在 Python 中,可以使用 isinstance() 函数来判断一个变量是否是字符串类型。字符串在 Python 中是以 str 类型表示的。下面是一些示例代码,展示如何判断一个变量是否是字符串类型: # 示例变量 var1 "Hello, World!" var2 12345 …

软件工程之需求工程(需求获取、分析、验证)

一、需求获取(Requirements Elicitation) 1. 定义与目标 需求获取是通过与用户、利益相关者等交互,识别并捕获系统需求的过程,目标是明确用户意图与业务目标,避免后期因需求偏差导致返工。 2. 主要方法 问卷法&…

Java简单生成pdf

生成这样的PDF 直接上代码 public static void main(String[] args) {String logoPath "Q:\\IdeaWork\\Demo\\src\\main\\webapp\\images\\logo.jpg"; // 替换为实际路径String baseDir "E:/Demo/TEST/problem/Generate"; // 基础目录int year 2025; //…

k8s存储介绍(六)StorangeClass

一、Kubernetes 存储类(StorageClass)详解 1. 什么是 StorageClass? 在 Kubernetes 中,StorageClass(存储类)是一种用于动态创建 PersistentVolume(PV)的资源对象。它允许管理员根…

C++:allocator类(动态数组续)

1.为什么需要 allocator? 在 C 中,动态内存管理通常通过 new 和 delete 完成: int* p new int; // 分配内存 构造对象 delete p; // 析构对象 释放内存 但 new 和 delete 有两个问题: 耦合性:将内…

北斗导航 | 中国北斗卫星导航系统的发展历程——“三步走”战略:背景,信号频点,调制方式,短报文,等

中国北斗卫星导航系统的发展历程按照“三步走”战略逐步推进,从区域服务到全球覆盖,形成了北斗一号、北斗二号、北斗三号三代系统的迭代升级,展现了中国航天科技的自主创新与突破。以下是各阶段的核心内容与发展特点综述:一、北斗一号:中国卫星导航的奠基(1994-2003年) …

Headless Chrome 优化:减少内存占用与提速技巧

在当今数据驱动的时代,爬虫技术在各行各业扮演着重要角色。传统的爬虫方法往往因为界面渲染和资源消耗过高而无法满足大规模数据采集的需求。本文将深度剖析 Headless Chrome 的优化方案,重点探讨如何利用代理 IP、Cookie 和 User-Agent 设置实现内存占用…

英伟达GB300新宠:新型LPDDR5X SOCAMM内存

随着人工智能(AI)、机器学习(ML)和高性能计算(HPC)应用的快速发展,对于高效能、大容量且低延迟内存的需求日益增长。NVIDIA在其GB系列GPU中引入了不同的内存模块设计,以满足这些严格…

静态网页应用开发环境搭建实战教程

1. 前言 静态网页开发是前端工程师的基础技能之一,无论是个人博客、企业官网还是简单的Web应用,都离不开HTML、CSS和JavaScript。搭建一个高效的开发环境,能够极大提升开发效率,减少重复工作,并优化调试体验。 本教程…

Python每日一题(9)

Python每日一题 2025.3.29 一、题目二、分析三、源代码四、deepseek答案五、源代码与ai分析 一、题目 question["""企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%,利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部…

游戏引擎学习第187天

看起来观众解决了上次的bug 昨天遇到了一个相对困难的bug,可以说它相当棘手。刚开始的时候,没有立刻想到什么合适的解决办法,所以今天得从头开始,逐步验证之前的假设,收集足够的信息,逐一排查可能的原因&a…

【入门初级篇】布局类组件的使用(1)

【入门初级篇】布局类组件的使用(1) 视频要点 (1)章节大纲介绍 (2)布局类组件类型介绍:行布局、列布局、标题 (3)实操演示:列表统计查询布局模型 点击访问my…

对内核fork进程中写时复制的理解记录

前言 文章写于学习Redis时对aof后台重写中写时复制的疑问 一、感到不理解的歧义 在部分技术文档中(以小林的文章为例),对写时复制后的内存权限存在如歧义: ! 二、正确技术表述 根据Linux内核实现(5.15版本&#x…