Python 嵌套字典取值:30-seconds-of-python 的 `get` 片段深度解析
教程文档【免费下载链接】30-seconds-of-pythonShort Python code snippets for all your development needs项目地址https://gitcode.com/gh_mirrors/30/30-seconds-of-python点击查看免费下载在 Python 开发中读取多层级嵌套的字典或列表结构如 JSON 配置、接口返回值是最常见的操作之一。本文以 30-seconds-of-python 仓库中的 get 片段 为核心逐行拆解functools.reduce()与operator.getitem()的组合用法讲解其内部执行流程、边界行为并结合仓库内pluck、find_key等相关片段进行横向对比帮助你彻底掌握一套简洁、可读、可复用的嵌套数据取值方案。片段速览一条语句完成嵌套取值该片段定位于 snippets/get.md其功能正如文档所述Retrieves the value of the nested key indicated by the given selector list from a dictionary or list根据给定的选择器列表从一个字典或列表中检索嵌套键对应的值。换言之当我们需要访问类似data[freddy][name][last]这种多层结构时不必层层书写下标只需把路径[freddy, name, last]交给get()即可一次性取出目标值。该片段完整代码如下from functools import reduce from operator import getitem def get(d, selectors): return reduce(getitem, selectors, d)片段实现要点原文给出的两条设计思路使用functools.reduce()迭代selectors列表对selectors中的每个 key 应用operator.getitem()将其取出的值作为下一次迭代的迭代对象iteratee。源码逐行拆解reduce 与 getitem 如何协同工作operator.getitem把下标访问变成一等函数在 Python 中d[key]与lst[index]的下标访问语法本质上是调用了对象的__getitem__()方法。operator.getitem()正是这一操作的函数化封装——它接受一个容器和键等价于d[key]import operator operator.getitem({a: 1}, a) # 1等价于 {a: 1}[a] operator.getitem([10, 20, 30], 1) # 20等价于 [10, 20, 30][1]这种「函数化」的意义在于getitem可以直接被当作参数传递给高阶函数这正是片段选择它的原因——reduce()需要一个可调用对象作为累积函数。functools.reduce从左到右逐层下沉functools.reduce(function, iterable, initializer)会从左到右地累积应用function其中initializer作为第一次调用的初始值。在本片段中容器参数d初始的字典或列表作为初始值传入selectors列表中的每一个元素依次作为「要取出的键/下标」每一步的结果一个更深层的子容器或最终值自动成为下一步的容器。等价地get(users, [freddy, name, last])在语义上就相当于step1 users[freddy] # 得到内层字典 step2 step1[name] # 得到更深一层字典 step3 step2[last] # 得到最终值 smith这正是片段「用函数式方式书写手写下标链」的本质。此外当selectors为空列表时reduce()会直接返回初始值d本身即get(data, [])等于原数据行为与预期一致。实战示例字典与列表混合嵌套的取值片段文档给出了一个兼顾「字典嵌套」与「列表下标」的完整示例直接继承了原文档内容users { freddy: { name: { first: fred, last: smith }, postIds: [1, 2, 3] } } get(users, [freddy, name, last]) # smith get(users, [freddy, postIds, 1]) # 2值得注意的是第二个调用selectors中的1是整数它作用于postIds这个列表取出下标为 1 的元素。这说明该片段对字典的字符串键与列表的整数下标一视同仁——只要容器支持下标访问即实现了__getitem__getitem就能照常工作。这一特性让它尤其适合处理「字典套列表、列表再套字典」的真实数据例如接口响应的 JSON 结构。边界行为什么情况下会抛出异常由于getitem就是一次原生下标访问它的失败模式与手写d[key]完全一致这一点可以从片段实现直接推断值得在实际使用前明确键不存在访问不存在的字典键会抛出KeyError。例如get(users, [freddy, age])会报错下标越界访问超出列表长度的下标会抛出IndexError。例如get(users, [freddy, postIds, 5])会报错不可下标对象如果某一层取出的值是整数、字符串等不可下标类型继续传入getitem会抛出TypeError如get(users, [freddy, name, first, x])。也就是说该片段遵循「fail fast」语义路径写错立即报错而不是静默返回None。如果你的业务场景需要「路径缺失时返回默认值」的宽容行为可以在外层包一层try/except或改写成基于dict.get()的版本下面会给出参考实现。从源码结构看原片段刻意保持 2 空格缩进、单行实现的极简风格遵循了仓库 CONTRIBUTING.md 中「简洁、易读、只使用原生 Python 3.6 模块」的规范。仓库内相关片段横向对比什么时候该用谁30-seconds-of-python 仓库中还提供了多个围绕字典/列表取值的小工具将它们与get对比能更清晰地把控各自的使用边界。片段文件适用场景getget.md按路径读取单个深层嵌套值字典键 列表下标混合pluckpluck.md将「字典列表」按同一 key 抽取为一列值如pluck(simpsons, age)得到[8, 36, 34, 10]find_keyfind-key.md按值反查第一个匹配的键如从ages中找到值为 11 的键Isabelcheck_propcheck-prop.md构造一个对字典某属性做断言的函数如check_age(user)判断age 18values_onlyvalues-only.md仅提取扁平字典的所有值不处理嵌套简单来说取单层平铺数据用values_only/pluck按值找键用find_key按路径取深层值get是仓库给出的标准答案。而 deep-flatten.md 负责把任意层嵌套的列表压平与get面向的「深入结构取值」互为反向操作可一并阅读。进阶扩展带默认值的宽容取值基于片段的实现思路可以很容易地扩展出一个不抛异常、支持缺省值的版本。下面这段代码在保留「selector 路径」设计的同时用try/except捕获getitem可能抛出的三类异常并返回调用方给定的默认值from functools import reduce from operator import getitem def get_default(d, selectors, defaultNone): try: return reduce(getitem, selectors, d) except (KeyError, IndexError, TypeError): return default使用效果users { freddy: { name: {first: fred, last: smith}, postIds: [1, 2, 3] } } get_default(users, [freddy, name, last]) # smith get_default(users, [freddy, age], defaultN/A) # N/A键不存在 get_default(users, [freddy, postIds, 9]) # None下标越界需要说明的是这段扩展仅作为思路示范仓库本身并未包含get_default如需严格跟随仓库内容请以 get.md 中的原始实现为准。但这一示例足以说明片段的核心价值在于把「路径遍历」抽象成一段可复用的逻辑业务层可以放心地在此基础上做容错、日志或数据转换。延伸阅读仓库中 reduce 的其他妙用get并非仓库中唯一使用functools.reduce()的片段。把它与其他片段对照阅读可以加深对函数式累积思想的理解lcm.md用reduce(lambda x, y: int(x * y / gcd(x, y)), numbers)依次把两两的最小公倍数累积到整个列表返回列表的最小公倍数compose.md 与 compose-right.md用reduce依次把多个函数复合为一个新函数实现函数式组合。三者的共性在于reduce把「一系列元素」压缩成「一个结果」而压缩规则完全由传入的函数决定。在get中这个规则恰好是「取出当前容器的某个键」——于是路径列表被逐层压成最终的嵌套值。小结30-seconds-of-python 的get片段用两行核心代码reducegetitem优雅地解决了嵌套结构的取值问题兼具声明式风格与复用性。总结本文要点原理reduce(getitem, selectors, d)相当于把selectors中的每个键/下标依次作用到容器上逐层下沉直到拿到目标值能力字典字符串键与列表整数下标统一支持可直接应对 JSON 这类混合嵌套数据边界路径不存在、越界或中间层不可下标时抛出异常属于 fail-fast 设计对比单层取值用pluck/values_only按值找键用find_key深层取值首选get扩展可基于try/except包装出带默认值的宽容版本满足业务兜底需求。如需查看原片段、参与贡献或同类工具可访问仓库中的 get.md、片段模板 及 贡献指南。赞分享教程文档【免费下载链接】30-seconds-of-pythonShort Python code snippets for all your development needs项目地址https://gitcode.com/gh_mirrors/30/30-seconds-of-python点击查看免费下载相关推荐用 defaultdict 反转字典解析 30-seconds-of-python 的 collect_dictionary 片段用 defaultdict 反转字典解析 30 seconds of python 的 collect_dictionary 片段 导读 collect_di教程文档30-seconds-of-python 片段精讲用 find_key 在字典中按值反向查找键30 seconds of python 片段精讲用 find_key 在字典中按值反向查找键 本文以 30 seconds of python 仓库中的 f教程文档Python 最大公约数GCD计算30-seconds-of-python 的 gcd 片段深度解析Python 最大公约数GCD计算30 seconds of python 的 gcd 片段深度解析 本文以 30 seconds of python 仓教程文档上一篇如何快速部署Silero VAD语音活动检测系统面向开发者的完整配置指南下一篇小米门锁临时密码终极指南hass-xiaomi-miot number组件与服务调用详解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

bk-cmdb 开放 API 之创建模型(create_object):参数详解、请求响应示例与源码级实现原理

bk-cmdb 开放 API 之创建模型(create_object):参数详解、请求响应示例与源码级实现原理

后端企业应用运维 【免费下载链接】bk-cmdb 蓝鲸智云配置平台(BlueKing CMDB) 项目地址: https://gitcode.com/gh_mirrors/bk/bk-cmdb 点击查看 免费下载 导读 本文基于蓝鲸智云配置平台(bk-cmdb)开放 API 文档中「创建模型(Cre…

2026/10/14 20:26:45 阅读更多 →
本地优先与隐私解析:Home Assistant WashData收集哪些数据?Community Store完整使用指南

本地优先与隐私解析:Home Assistant WashData收集哪些数据?Community Store完整使用指南

【免费下载链接】ha_washdata Home Assistant integration for smart-plug appliance monitoring: detects cycles, matches programs, estimates time remaining. Supports washing machines, dryers, dishwashers and more. 项目地址: https://gitcode.com/gh_mir…

2026/10/14 20:26:45 阅读更多 →
webmagic-scripts 使用指南:用 JavaScript/Ruby 脚本零代码编写 WebMagic 爬虫

webmagic-scripts 使用指南:用 JavaScript/Ruby 脚本零代码编写 WebMagic 爬虫

后端网页爬虫 【免费下载链接】webmagic A scalable web crawler framework for Java. 项目地址: https://gitcode.com/gh_mirrors/we/webmagic 点击查看 免费下载 webmagic-scripts 是 WebMagic 爬虫框架(Java)中的一个实验性子模块&#x…

2026/10/14 20:26:45 阅读更多 →

最新新闻

阿里云短信签名模板审核避坑指南与Python调用实战

阿里云短信签名模板审核避坑指南与Python调用实战

简介:本资源是一份面向Java开发者的企业级短信集成实战示例,聚焦阿里云短信服务(Dysmsapi)的快速接入与稳定调用,适用于用户注册验证、密码重置、订单通知等典型业务场景。压缩包共92个文件,含68个C#源码文…

2026/10/14 21:13:53 阅读更多 →
HAProxy配置文件五段结构详解:从零搭建HTTP负载均衡

HAProxy配置文件五段结构详解:从零搭建HTTP负载均衡

第一次接触 HAProxy 的时候,大多数人都是被那堆配置项劝退的。老实说,作为 Linux 下应用最广的开源负载均衡器之一,HAProxy 的配置文件反而没那么玄乎——它核心就五段:global、defaults、frontend、backend、listen。搞懂它们分别…

2026/10/14 21:13:53 阅读更多 →
操作系统内存管理四层结构:从malloc到物理页的完整链路

操作系统内存管理四层结构:从malloc到物理页的完整链路

1. 项目概述:为什么内存管理是操作系统的“呼吸系统”你打开一个浏览器,再开个文档编辑器,顺手又启动了音乐播放器——三四个程序同时跑着,但你的电脑没卡死,也没报“内存不足”,更不会因为某个程序偷偷多占…

2026/10/14 21:13:53 阅读更多 →
从感知机到多层感知机:机器学习分类模型的进化路线与学习基石

从感知机到多层感知机:机器学习分类模型的进化路线与学习基石

如果你翻过任何一本机器学习教材,第一眼很可能会看到一个几十年前的老模型——感知机。我最早学的时候也觉得奇怪:一个连XOR都搞不定的模型,凭什么排在神经网络前面?等到自己动手写过几个分类任务,才明白它最大的价值不…

2026/10/14 21:13:53 阅读更多 →
顾诚·明末农民战争史

顾诚·明末农民战争史

明末农民战争是中国古代史上规模最大、影响最深远的农民起义浪潮之一,爆发于明朝末年社会矛盾全面激化的乱世,横跨天启、崇祯两朝,以陕西为起点,席卷北方、中原、西南大半疆域。这场持续近二十年的战乱,彻底瓦解了明朝…

2026/10/14 21:13:53 阅读更多 →
plotIt:ROOT直方图批量绘制与样式统一实战指南

plotIt:ROOT直方图批量绘制与样式统一实战指南

简介:plotIt 是一套面向 C 开发者与高能物理、数据科学领域研究人员的 ROOT 直方图绘制工具,旨在解决手动创建和管理直方图繁琐、代码细节冗长的问题。它提供友好的 API,支持单维、二维乃至三维直方图的快速生成,并可自定义 bin 数…

2026/10/14 21:12:52 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →