在python中,我们有两个字典需要合并的时候,可以使用字典的update方法
a = {'a': 1, 'b': 2}
b = {'x': 3, 'y': 4}
a.update(b)
print(a)
问题:这个方法它会改变其中的一个字典。如果我们不想改变原有的两个字典,那么我们必须要单独再创建一个字典,但是如果原来的两个字典非常大的的话,那么这种方式将会浪费大量的内存。所以无论是直接修改原有的其中一个字典,还是创建一个新字典,这两种方案都有点缺陷。那么有没有既不修改原有字典,又不另外创建一个新的字典的方法呢?我们可以使用collections模块下面的ChainMap
ChainMap的使用
from collections import ChainMap
a = {'a': 1, 'b': 2}
b = {'x': 3, 'y': 4}
c = ChainMap(a, b)
print(c['a'])
print(c['y'])
原理
ChainMap不会真的把字典合并在一起,而是在内部存储一个Key到每个字典的映射,当你读取c['a']的时候,它先去查询这个Key在哪个字典里面,然后再去对应的字典里面查询对应的值。所以使用ChainMap几乎不需要额外的内存空间(当前这个对象自己会占用一些空间,但是如果要合并大字典,那么它自己占用的空间几乎可以忽略不记)
问题
1.如果两个字典里面有一个Key的名字相同,那么使用ChainMap以后会读取哪一个
使用第一个拥有这个key的字典里面的值
2.如果为ChainMap对象添加一个Key-Value对,那么这个值会添加到哪里?
添加到第一个字典里面
3.如果从原字典里面删除一个Key,ChainMap对象里面的Key也会消失吗?
会,只要修改了源字典里面的数据,对应的ChainMap里面的也会修改
4.如果从ChainMap对象里面删除一个Key,那么原字典里面的Key会消失吗?
如果这个Key只在一个源字典中存在,那么这个Key会被从源字典中删除。如果这个Key在多个字典中都存在,那么Key会被从第一个字典中删除。当被从第一个字典中删除以后,第二个源字典的Key可以继续被 ChainMap 读取。