• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

在Python中合并字典模块ChainMap的隐藏坑【推荐】

python 搞代码 4年前 (2022-01-09) 34次浏览 已收录 0个评论

在Python中,当我们有两个字典需要合并的时候,可以使用字典的 update 方法,例如:

a = {'a': 1, 'b': 2}
b = {'x': 3, 'y': 4}
a.update(b)
print(a)

运行效果如下图所示:

如果原来的两个字典非常大,那么这种方式将会浪费大量的内存。

无论是直接修改原有的其中一个字典,还是创建另一个字典,这两种方案都有点缺陷。那么有没有既不修改原有字典,又不另外创建一个新的字典的方法呢?

答案就是 collections 模块下面的 ChainMap

使用 ChainMap 可以把多个字典合并成一个 ChainMap 对象。读写这个对象就像是读字典一样。

例如:

from collections import ChainMap
a =<i>本文来源gaodai$ma#com搞$代*码*网</i> {'a': 1, 'b': 2}
b = {'x': 3, 'y': 4}
c = ChainMap(a, b)
print(c['a'])
print(c['y'])

运行效果如下图所示:

不仅可以“合并”两个字典, ChainMap 可以接受任意多个字典,并把他们全都合在一起:

from collections import ChainMap
a = {'a': 1, 'b': 2}
b = {'x': 3, 'y': 4}
c = {'z': 5, 'w': 6}
d = {'m': 7, 'h': 8, 'k': 9}
e = ChainMap(a, b, c, d)
print(e['a'], e['y'], e['z'], e['k'])

运行效果如下图所示:

ChainMap 不会真的把字典合并在一起,而是在内部储存一个Key到每个字典的映射,当你读取 e[key] 的时候,它先去查询这个key在哪个字典里面,然后再去对应的字典里面查询对应的值。所以使用ChainMap几乎不需要额外的内存空间(当前这个对象自己会占用一些空间,但是如果要合并大字典,那么它自己占用的空间几乎可以忽略)。

所以你是不是觉得使用 ChainMap 就能实现完美合并字典了呢?

在使用它之前,你一定要理解它的运行原理。如果你理解了它的运行原理,那么下面几个问题,你在运行代码之前就会知道结果是什么:

如果两个字典里面有一个Key的名字相同,那么使用ChainMap以后会读取哪一个? 如果为ChainMap对象添加一个Key-Value对,那么这个值会添加到哪里? 如果从原字典里面删除一个Key,ChainMap对象里面的Key也会消失吗? 如果从ChainMap对象里面删除一个Key,那么原字典里面的Key会消失吗?

首先来说第一个问题的答案:

ChainMap 对象会使用第一个拥有这个Key的字典里面的值,如下图所示:

第二个问题,新的Key-Value会被添加进第一个字典里面,如下图所示:


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:在Python中合并字典模块ChainMap的隐藏坑【推荐】

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址