在Python中更新嵌套字典

千强君_4004

千强君_4004

2023-09-09

1333人浏览

转载

在python中更新嵌套字典

在 Python 中,字典是通用的数据结构,可让您有效地存储和检索键值对。特别是,嵌套字典提供了一种组织和表示复杂数据的便捷方法。然而,更新嵌套字典中的值有时可能有点困难。

访问嵌套字典元素

要更新嵌套字典中的值,我们首先需要访问字典层次结构中的特定键。 Python 允许您通过连续使用键来访问嵌套元素。例如 -

nested_dict = {'outer_key': {'inner_key': 'old_value'}}
nested_dict['outer_key']['inner_key'] = 'new_value'

在上面的代码片段中,我们通过连续链接键来访问嵌套元素“inner_key”,并将其值更新为“new_value”。

更新单级嵌套字典

有时,您可能会遇到嵌套字典,其中不同级别的键没有固定的结构。在这种情况下,需要更通用的方法。 Python 提供了 update() 方法,它允许我们将一个字典合并到另一个字典中,从而更新其值。这是一个示例 −

nested_dict = {'outer_key': {'inner_key': 'old_value'}}
update_dict = {'inner_key': 'new_value'}
nested_dict['outer_key'].update(update_dict)

在上面的代码片段中,我们创建了一个单独的字典 update_dict ,其中包含我们要更新的键值对。通过使用 update() 方法,我们将 update_dict 合并到指定键级别的嵌套字典中,从而有效地更新其值。

更新多级嵌套字典

如果需要更新嵌套字典的多个级别中的值,可以采用递归方法。这种方法涉及递归遍历字典,直到找到所需的键。这是一个示例 −

def update_nested_dict(nested_dict, keys, new_value):
   if len(keys) == 1:
      nested_dict[keys[0]] = new_value
   else:
      key = keys[0]
      if key in nested_dict:
         update_nested_dict(nested_dict[key], keys[1:], new_value)

nested_dict = {'outer_key': {'inner_key': {'deep_key': 'old_value'}}}
keys = ['outer_key', 'inner_key', 'deep_key']
new_value = 'new_value'
update_nested_dict(nested_dict, keys, new_value)

在上面的代码片段中,我们定义了一个递归函数 update_nested_dict ,它将嵌套字典、键列表和新值作为参数。该函数检查列表中是否只剩下一个键;如果是,它会更新嵌套字典中的值。否则,它会更深入地遍历嵌套字典,直到找到所需的键。

处理丢失的密钥并创建新密钥

更新嵌套字典时,重要的是要考虑指定键可能不存在的情况。 Python 提供了多种技术来处理此类情况并在需要时创建新密钥。

使用Setdefault()方法

setdefault() 方法是在处理缺失键时更新嵌套字典中的值的便捷方法。如果键不存在,它允许您指定默认值。如果找到该键,则返回现有值。否则,默认值将插入到字典中。这是一个示例 −

nested_dict = {'outer_key': {}}
nested_dict['outer_key'].setdefault('inner_key', 'new_value')

在上面的代码片段中,我们使用 setdefault() 方法来更新嵌套字典的“outer_key”内的“inner_key”的值。如果“inner_key”不存在,则使用值“new_value”创建它。

使用 Defaultdict 类

集合模块中的 defaultdict 类提供了一种强大的方法来处理嵌套字典中缺少的键。当访问不存在的键时,它会自动分配一个默认值。这是一个示例 −

from collections import defaultdict

nested_dict = defaultdict(dict)
nested_dict['outer_key']['inner_key'] = 'new_value'

在上面的代码片段中,我们创建了一个defaultdict,并将dict类型作为默认工厂。这确保任何不存在的键都会自动创建一个新的嵌套字典。然后,我们继续使用值“new_value”更新“outer_key”内的“inner_key”。

RedLine
RedLine

一款AI工具,主要用于Claude.ai(Max/Pro)与 OpenAI(Plus/Pro/Codex)的实时速率限制感知功能。告别限额红线——您的代理将在每次心跳时自动检查剩余配额,适合需要提升相关任务效率的用户。

下载

更新深度嵌套字典中的值

如果您的嵌套字典具有多个嵌套级别,并且您需要更新最内层中的值,则递归方法会变得更加有用。您可以通过相应修改遍历逻辑来扩展递归函数以处理深度嵌套的字典。

def update_deep_nested_dict(nested_dict, keys, new_value):
   if len(keys) == 1:
      nested_dict[keys[0]] = new_value
   else:
      key = keys[0]
      if key in nested_dict:
         update_deep_nested_dict(nested_dict[key], keys[1:], new_value)
      else:
         nested_dict[key] = {}
         update_deep_nested_dict(nested_dict[key], keys[1:], new_value)

nested_dict = {'outer_key': {'inner_key': {'deep_key': 'old_value'}}}
keys = ['outer_key', 'inner_key', 'deep_key']
new_value = 'new_value'
update_deep_nested_dict(nested_dict, keys, new_value)

在上面的代码片段中,我们增强了之前的递归函数来处理深度嵌套的字典。如果任意级别缺少某个键,则会创建一个新的空字典,并且该函数将继续遍历,直到到达最内层的键。

不可变嵌套字典

需要注意的是,Python 中的字典是可变对象。因此,当您更新嵌套字典时,更改将反映在对该字典的所有引用中。如果您需要维护嵌套字典的原始状态,可以在进行任何更新之前创建它的深层副本。

import copy

nested_dict = {'outer_key': {'inner_key': 'old_value'}}
updated_dict = copy.deepcopy(nested_dict)
updated_dict['outer_key']['inner_key'] = 'new_value'

示例

import copy

nested_dict = {'outer_key': {'inner_key': 'old_value'}}
updated_dict = copy.deepcopy(nested_dict)
updated_dict['outer_key']['inner_key'] = 'new_value'

print("Original nested_dict:")
print(nested_dict)

print("\nUpdated_dict:")
print(updated_dict)

输出

以下是 − 部分中提到的代码片段的输出

Original nested_dict:
{'outer_key': {'inner_key': 'old_value'}}

Updated_dict:
{'outer_key': {'inner_key': 'new_value'}}

在上面的代码片段中,copy.deepcopy()函数创建了嵌套字典的完整副本,包括所有级别的嵌套。这允许您更新复制的词典而不影响原始词典。

使用字典理解更新值

For simple updates within a nested dictionary, you can use dictionary comprehensions. This approach is suitable when you have a known set of keys to update.

示例

nested_dict = {'outer_key': {'inner_key': 'old_value'}}
keys_to_update = ['outer_key']
updated_dict = {key: 'new_value' if key in keys_to_update else value for key, value in nested_dict.items()}

输出

这是上述代码片段的输出−

Original nested_dict:
{'outer_key': {'inner_key': 'old_value'}}

Updated_dict:
{'outer_key': {'inner_key': 'new_value'}}

在代码片段中,我们从包含嵌套结构的nested_dict字典开始。我们使用copy.deepcopy()创建nested_dict的深层副本并将其分配给updated_dict。然后,我们将updated_dict中'outer_key'内的'inner_key'的值更新为'new_value'。

最后,我们打印原始的nested_dict和更新后的updated_dict。从输出中可以看到,原始的nested_dict保持不变,而updated_dict反映了更新后的值。

结论

在 Python 中更新嵌套字典可能涉及访问特定键、合并字典或使用递归技术。通过了解这些不同的方法,您可以根据您的特定要求有效地更新嵌套字典中的值。在选择最合适的方法时,请记住考虑嵌套字典的结构和复杂性。

Python 的灵活性和内置方法(例如 update()、setdefault() 和 defaultdict 类)提供了强大的工具来处理各种情况,包括丢失键和创建新键。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.12.01

2741

7

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

2025.12.22

376

20

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

2026.01.06

417

22

C++ 数据结构与算法实现教程合集
C++ 数据结构与算法实现教程合集

以 C++ 为实现语言,系统讲解核心数据结构与算法,涵盖链表(单链表/双链表/环检测)、栈与队列(单调栈/优先队列)、二叉树(遍历/BST/AVL/红黑树)、哈希表(开地址法/链地址法)、图(邻接表/BFS/DFS/Dijkstra/拓扑排序)、常见排序算法(快排/归并/堆排/计数排序)的实现与复杂度分析,同时分享 LeetCode 刷题技巧、竞赛编程常用模板(二分/前缀和/滑动窗口/动态规划),帮助开发者夯实算法基础。

2026.05.09

492

25

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

2026.11.02

0

14

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

2026.11.02

0

17

Uvicorn安装配置教程
Uvicorn安装配置教程

本专题汇总了Uvicorn的安装配置教程与部署指南,涵盖通过pip安装Uvicorn、启动FastAPI/Starlette应用、开发模式热重载(--reload)及多进程工作模式配置等核心操作。同时整理了结合Gunicorn的生产部署方案、HTTPS与反向代理配置及性能调优技巧,助你快速完成Uvicorn服务的安装与上线部署。

2026.11.02

0

17

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

100

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

80

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习