zoukankan      html  css  js  c++  java
  • ChainMap合并字典

    在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 读取。
    

    -------------------------------------------

    个性签名:代码过万,键盘敲烂!!!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

  • 相关阅读:
    20200414:mysql原子性和持久性怎么保证
    20200417:说说redis的rdb原理。假设服务器的内存8g,redis父进程占用了6g,子进程fork父进程后,子父进程总共占用内存12g,如何解决内存不足的问题?(挖)
    [九省联考2018]秘密袭击coat
    CF1158F Density of subarrays
    忘情
    [IOI2018] meetings 会议
    [AGC013E] Placing Squares
    [八省联考2018]林克卡特树
    [NOI2016] 国王饮水记
    [十二省联考 2019]皮配
  • 原文地址:https://www.cnblogs.com/weiweivip666/p/14582924.html
Copyright © 2011-2022 走看看