合并多个字典或映射

问题

现在有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操作,比如查找值或者检查某些键是否存在。

解法

假如你有如下两个字典:

a = {'x': 1, 'z': 3 }
b = {'y': 2, 'z': 4 }

现在假设你必须在两个字典中执行查找操作 (比如先从 a 中找,如果找不到再在 b 中找)。一个非常简单的解决方案就是使用 collections 模块中的 ChainMap 类。比如:

from collections import ChainMap
c = ChainMap(a,b)
print(c['x']) # Outputs 1 (from a)
print(c['y']) # Outputs 2 (from b)
print(c['z']) # Outputs 3 (from a)

讨论

一个 ChainMap 接受多个字典并将它们在逻辑上变为一个字典。然后,这些字典并不是真的合并在一起了, ChainMap 类只是在内部创建了一个容纳这些字典的列表并重新定义了一些常见的字典操作来遍历这个列表。大部分字典操作都是可以正常使用的,比如:

>>> len(c)
3
>>> list(c.keys())
['x', 'y', 'z']
>>> list(c.values())
[1, 2, 3]
>>>

如果出现重复键,那么第一次出现的映射值会被返回。因此,例子程序中的 c[‘z’]总是会返回字典 a 中对应的值,而不是 b 中对应的值。

对于字典的更新或删除操作总是影响的是列表中第一个字典。比如:

>>> c['z'] = 10
>>> c['w'] = 40
>>> del c['x']
>>> a
{'w': 40, 'z': 10}
>>> del c['y']
Traceback (most recent call last):
...
KeyError: "Key not found in the first mapping: 'y'"
>>>

ChainMap 对于编程语言中的作用范围变量 (比如 globals , locals 等) 是非常有用的。事实上,有一些方法可以使它变得简单:

>>> values = ChainMap()
>>> values['x'] = 1
>>> # Add a new mapping
>>> values = values.new_child()
>>> values['x'] = 2
>>> # Add a new mapping
>>> values = values.new_child()
>>> values['x'] = 3
>>> values
ChainMap({'x': 3}, {'x': 2}, {'x': 1})
>>> values['x']
3
>>> # Discard last mapping
>>> values = values.parents
>>> values['x']
2
>>> # Discard last mapping
>>> values = values.parents
>>> values['x']
1
>>> values
ChainMap({'x': 1})
>>>

作为 ChainMap 的替代,你可能会考虑使用 update() 方法将两个字典合并。比如:

>>> a = {'x': 1, 'z': 3 }
>>> b = {'y': 2, 'z': 4 }
>>> merged = dict(b)
>>> merged.update(a)
>>> merged['x']
1
>>> merged['y']
2
>>> merged['z']
3
>>>

这样也能行得通,但是它需要你创建一个完全不同的字典对象 (或者是破坏现有字典结构)。同时,如果原字典做了更新,这种改变不会反应到新的合并字典中去。比如:

>>> a['x'] = 13
>>> merged['x']
1

ChainMap 使用原来的字典,它自己不创建新的字典。所以它并不会产生上面所说的结果,比如:

>>> a = {'x': 1, 'z': 3 }
>>> b = {'y': 2, 'z': 4 }
>>> merged = ChainMap(a, b)
>>> merged['x']
1
>>> a['x'] = 42
>>> merged['x'] # Notice change to merged dicts
42
>>>

《Python Cookbook 3rd》笔记(1.20):合并多个字典或映射相关推荐

  1. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  2. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  3. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  4. 《Python cookbook》笔记一

    <Python cookbook> 第一章 数据结构和算法 - *号解压多个变量 - 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可 ...

  5. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  6. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

  7. python Cookbook 学习笔记(一)

    文章目录 前言 一. 数据结构和算法 1.获取可迭代对象部分元素 用处讨论 2. 保存最后N个元素常利用depue队列特性:先进先出 3. 找到最大或最小的N个元素 4. 创建一键多值的字典 5. 让 ...

  8. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  9. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

最新文章

  1. Android ViewAnimationUtils (动画) 的使用
  2. 马斯克再发声,称人工智能是人类文明面临的最大风险
  3. Tyznn人脸识别温度检测智能门禁系统现货发售,助力疫情防控
  4. AOM联盟:AV1完成1.0版定稿
  5. ajax提交file空指针,excel导入上传文件报空指针错误
  6. HDU1181:变形课(DFS)
  7. 五分钟,手撸一个Spring容器!
  8. SNMP客户端工具MIB Browser
  9. 新年干货 | NLP一路走来的经验之谈
  10. 一分钟了解:NMN的副作用和危害?nmn对人体有害吗?
  11. spring mvc
  12. 2023年大学毕业生,我有话想对你说
  13. IoC Containers and the DI pattern
  14. 游戏开发常用引擎工具介绍对比区别(UE4,Unity,Cocos,LayaAir,[egret白鹭])
  15. 复杂网络分析库NetworkX学习笔记(4):统计指标计算
  16. 一文告诉你,SIMULIA/Abaqus究竟有多强大
  17. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记四(3):嵌套向量中断控制器
  18. Kafka完美解决:Error while executing topic command:Replication factor: 1 larger than available brokers:0
  19. 除了男足,中国元素霸占了世界杯
  20. K-Means 聚类算法分析客户群价值

热门文章

  1. Linux重启网卡的方法
  2. 前端切换视图_前端架构 101(五):从 Flux 进化到 Model-View-Presenter
  3. python 头条 上传_Python+selenium自动化之文件上传
  4. ie浏览器网页版进入_IE浏览器打开网页速度很慢的解决办法
  5. 【转】DICOM文件格式剖析(初识)
  6. 【转】c# 操作webservice(经典入门教程+MSDN必胜)(有自己修改的部分)
  7. angular是MVC模式还是MVVM架构模式
  8. 【Python学习】 - Matplotlib二维绘图 - plt.matshow()和plt.imshow()区别对比
  9. 【洛谷 - P2756】飞行员配对方案问题(网络流最大流,输出方案)
  10. 【 FZU - 2214 】Knapsack problem(逆向0-1背包)