python cookbook 学习笔记 第一章 数据结构和算法(19)合并多个字典或映射

  • 合并多个字典或映射
  • 问题:
    • 现在有多个字典,想从逻辑上合并为一个单一的映射后执行某些操作,比如查找值或者检查某些键是否存在
  • 解决方案:
    • 假如有如下两个字典:
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"]) # 1
print(c["y"]) # 2
print(c["z"]) # 3
  • 讨论: 一个 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
print(a)     # {'x': 1, 'z': 10, 'w': 40}

del c["y"]   # KeyError: "Key not found in the first mapping: 'y'"
  • ChainMap 对于编程语言中的作用范围变量(比如,globals,locals等)是非常有用的,事实上,有一些 方法可以使得它变得简单:
values = ChainMap()
values["x"] = 1
values = values.new_child()
values["x"] = 2
values = values.new_child()
values["x"] = 3
print(values)  # ChainMap({'x': 3}, {'x': 2}, {'x': 1})
print(values["x"])  # 3

values = values.parents
print(values["x"])  # 2

values = values.parents
print(values["x"])  # 1

print(values)  # ChainMap({'x': 1})
  • 作为 ChainMap 的替代,可能会考虑 update() 方法将连个字典合并,比如:
a = {"x": 1, "z": 3}
b ={"y": 2, "z": 4}
merged = dict(b)
merged.update(a)
print(merged)  # {'y': 2, 'z': 3, 'x': 1}
  • 这样也能行的通,但是需要创建一个完全不同的字典对象(或者破坏现有字典结构)。同时,如果原字典做了更新, 这种改变不会反应到新的合并字典中去,比如:
a["x"] = 12
print(merged)  # {'y': 2, 'z': 3, 'x': 1}
  • ChainMap 使用原来的字典,自己并不创建新的字典。所以它不会产生上面的结果。比如:
a = {"x": 1, "z": 3}
b ={"y": 2, "z": 4}

merged = ChainMap(a, b)
print(merged)  # ChainMap({'x': 1, 'z': 3}, {'y': 2, 'z': 4})

a["x"] = 42
print(merged)  # ChainMap({'x': 42, 'z': 3}, {'y': 2, 'z': 4})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值