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

 更新时间:2019年06月27日 16:24:33   作者:青南  
在Python中,当我们有两个字典需要合并的时候,可以使用字典的 update 方法,接下来通过本文给大家介绍在Python中合并字典模块ChainMap的隐藏坑,感兴趣的朋友一起看看吧

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

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

运行效果如下图所示:

然而,这个方法有一个问题——它会改变其中一个字典。如果我们不想改变原有的两个字典,那么我们必需要单独再创建一个字典:

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

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

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

答案就是 collections 模块下面的 ChainMap

使用 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 可以接受任意多个字典,并把他们全都合在一起:

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会被添加进第一个字典里面,如下图所示:

第三个问题,如果修改了原来的字典,那么 ChainMap 对象也会相应更新:

第四个问题,如果这个Key只在一个源字典中存在,那么这个Key会被从源字典中删除。如果这个Key在多个字典中都存在,那么Key会被从第一个字典中删除。当被从第一个字典中删除以后,第二个源字典的Key可以继续被 ChainMap 读取。

以上4点,在你使用 ChainMap 的时候一定要牢记,否则可能会导致你发现不了的Bug。 

 总结

以上所述是小编给大家介绍的在Python中合并字典模块ChainMap的隐藏坑,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

相关文章

  • Python利用pyreadline模块实现交互式命令行开发

    Python利用pyreadline模块实现交互式命令行开发

    交互式命令行是一种方便用户进行交互的工具,能够使用户与计算机进行快速的交互操作,提高工作效率。本文主要介绍了如何利用pyreadline模块实现交互式命令行开发,需要的可以参考一下
    2023-05-05
  • python 实现list或string按指定分段

    python 实现list或string按指定分段

    今天小编就为大家分享一篇python 实现list或string按指定分段,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 基于Python实现自动关机小工具

    基于Python实现自动关机小工具

    上班族经常会遇到这样情况,着急下班结果将关机误点成重启,或者临近下班又通知开会,开完会已经迟了还要去给电脑关机。今天使用PyQt5做了个自动关机的小工具,设置好关机时间然后直接提交即可,需要的可以参考一下
    2022-10-10
  • Python抓取京东图书评论数据

    Python抓取京东图书评论数据

    最近接了个项目,需要抓取京东图书的评论,把代码放出来给大家分享下,希望能有所帮助
    2014-08-08
  • python xpath获取页面注释的方法

    python xpath获取页面注释的方法

    今天小编就为大家分享一篇python xpath获取页面注释的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • PyCharm安装Markdown插件的两种方法

    PyCharm安装Markdown插件的两种方法

    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。这篇文章主要介绍了PyCharm安装Markdown插件的两种方法,需要的朋友可以参考下
    2019-06-06
  • python实现月食效果实例代码

    python实现月食效果实例代码

    在本文里小编给大家整理了关于python实现月食效果的相关实例内容以及对应代码,有兴趣的朋友们学习下。
    2019-06-06
  • Python中深拷贝与浅拷贝的区别介绍

    Python中深拷贝与浅拷贝的区别介绍

    这篇文章介绍了Python中深拷贝与浅拷贝的区别,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Python完全新手教程

    Python完全新手教程

    Python完全新手教程...
    2007-02-02
  • numpy找出array中的最大值,最小值实例

    numpy找出array中的最大值,最小值实例

    下面小编就为大家分享一篇numpy找出array中的最大值,最小值实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04

最新评论