python 合并多个字典或映射

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

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

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

from collections import ChainMap

c = ChainMap(a, b)
print(c)
print(c['x'])
print(c['y'])
print(c['z'])

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

print(len(c))

print(list(c.keys()))
print(list(c.values()))

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

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

c['z'] = 10
c['w'] = 40
del c['x']

print(a, b)

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

values = ChainMap()

values['x'] = 1
print(values)

values = values.new_child()
print(values)
values['x'] = 2
print(values)
print(values['x'])
values = values.new_child()
values['x'] = 2
print(values)

values = values.parents
print(values)

values = values.parents
print(values)

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

c = {'x': 1, 'z': 3}
d = {'y': 2, 'z': 4}

merged = dict(d)
merged.update(c)
print(merged)

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

merged = ChainMap(c, d)
print(merged['x'])
c['x'] = 100
print(merged['x'])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值