python ChainMap的使用和说明详解
作者:茫茫碧落 发布时间:2022-03-03 08:22:30
ChainMap是Python collections模块中的一个成员,它用来将多个map组合到一起。Chain是链条的意思,字面意思就是把map串联到一起。
问题的背景是我们有多个字典或者映射,想把它们合并成为一个单独的映射,有人说可以用update进行合并,这样做的问题就是新建了一个数据结构以致于当我们对原来的字典进行更改的时候不会同步。如果想建立一个同步的查询方法,可以使用ChainMap
先看一下初步使用
from collections import ChainMap
a = {"x":1, "z":3}
b = {"y":2, "z":4}
c = ChainMap(a,b)
print(c)
print("x: {}, y: {}, z: {}".format(c["x"], c["y"], c["z"]))
输出:
ChainMap({'x': 1, 'z': 3}, {'y': 2, 'z': 4})
x: 1, y: 2, z: 3
[Finished in 0.1s]
这是ChainMap最基本的使用,可以用来合并两个或者更多个字典,当查询的时候,从前往后依次查询。
有一个注意点就是当对ChainMap进行修改的时候总是只会对第一个字典进行修改
In [6]: a = {"x":1, "z":3}
In [7]: b = {"y":2, "z":4}
In [8]: c = ChainMap(a, b)
In [9]: c
Out[9]: ChainMap({'z': 3, 'x': 1}, {'z': 4, 'y': 2})
In [10]: c["z"]
Out[10]: 3
In [11]: c["z"] = 4
In [12]: c
Out[12]: ChainMap({'z': 4, 'x': 1}, {'z': 4, 'y': 2})
In [13]: c.pop('z')
Out[13]: 4
In [14]: c
Out[14]: ChainMap({'x': 1}, {'z': 4, 'y': 2})
In [15]: del c["y"]
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
。。。。。。
KeyError: "Key not found in the first mapping: 'y'"
ChainMap和带有作用域的值,诸如全局变量,局部变量之间工作的时候特别有效,
In [4]: a = ChainMap()
In [5]: a["x"]=1
In [6]: a
Out[6]: ChainMap({'x': 1})
In [7]: b = a.new_child()
In [8]: b
Out[8]: ChainMap({}, {'x': 1})
In [9]: b["x"] = 2
In [10]: b
Out[10]: ChainMap({'x': 2}, {'x': 1})
In [11]: b["y"] = 3
In [12]: b
Out[12]: ChainMap({'x': 2, 'y': 3}, {'x': 1})
In [13]: a
Out[13]: ChainMap({'x': 1})
In [14]: c = a.new_child()
In [15]: c
Out[15]: ChainMap({}, {'x': 1})
In [16]: c["x"]
Out[16]: 1
In [17]: c["y"] = 1
In [18]: c
Out[18]: ChainMap({'y': 1}, {'x': 1})
In [19]: d = c.parents()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-19-dc4debb7ca3b> in <module>()
----> 1 d = c.parents()
TypeError: 'ChainMap' object is not callable
In [20]: d = c.parents
In [21]: d
Out[21]: ChainMap({'x': 1})
In [22]: d is a
Out[22]: False
In [23]: d == a
Out[23]: True
从原理上面讲,ChainMap实际上是把放入的字典存储在一个队列中,当进行字典的增加删除等操作只会在第一个字典上进行,当进行查找的时候会依次查找,new_child()方法实质上是在列表的第一个元素前放入一个字典,默认是{},而parents是去掉了列表开头的元素
In [24]: a = {"x":1, "z":3}
In [25]: b = {"y":2, "z":4}
In [26]: c = ChainMap(a,b)
In [27]: c
Out[27]: ChainMap({'x': 1, 'z': 3}, {'y': 2, 'z': 4})
In [28]: c.maps
Out[28]: [{'x': 1, 'z': 3}, {'y': 2, 'z': 4}]
In [29]: c.parents
Out[29]: ChainMap({'y': 2, 'z': 4})
In [30]: c.parents.maps
Out[30]: [{'y': 2, 'z': 4}]
In [31]: c.parents.parents
Out[31]: ChainMap({})
In [32]: c.parents.parents.parents
Out[32]: ChainMap({})
也正是因为底层是列表实现的,所以实际上ChainMap查询的字典实际上还是原来的字典的引用
ChainMap文档和示例:https://docs.python.org/3/library/collections.html#collections.ChainMap
来源:https://www.cnblogs.com/mangmangbiluo/p/9882097.html


猜你喜欢
- 了解如何在sublime编辑器中安装python软件包,以实现自动完成等功能,并在sublime编辑器本身中运行build。安装Sublim
- 环境准备python3.6PyCharm 2017.1.3Windows环境框架搭建selenium3.6安装方法:pip install
- Vue中有两个较为高级的静态方法mixin和extend,接下来我们来讨论下关于他们各自的原理和使用场景。Mixin:原理:先来看看官网的介
- 美餐每天发一个用Excel汇总的就餐数据,我们把它导入到数据库后,行政办公服务用它和公司内的就餐数据进行比对查重。初始实现是单线程,和imp
- 最近产品妹子提出了一个体验issue —— 用 iOS 在手Q阅读书友交流区发表书评时,光标点击总是不好定位到正确的位置:如上图,具体表现是
- Sun公司和Zmanda在3月18号声称他们正在一起合作,为MySQL Enterprise用户交付一种全面、全局数据备份与恢复解决方案。现
- <% dim result,result1 str="ad_asp之家_nzlkjlkfjoj
- 编写思路:把本地文件在客户端通过base64编码以后发送目的地.测试过程中,上传文件过大,导致超时不成功,后来经过改善.把编码分
- 从这一章开始,将进入 PPT 文件的自动化操作。关于 PPT 自动化操作所要实现的目的依然很简单。包括 “PPT的创建&
- 新搞了台linux云主机,瞎折腾折腾,先装个Python3。Linux环境下有其他软件需要Python2,如YUM,所以安装的Python3
- 一个用HTML和CSS实现的注册页面模板,废话不多说了,上代码!更新:使用JavaScript实现用户名和密码表单校验功能。代码如下:<
- SQL Server2005扩展函数已经不是一件什么新鲜的事了,但是我看网上的大部分都是说聚合函数,例子也比较浅,那么这里就讲讲我运用扩展函
- Simple Nested-Loop Join我们来看一下当进行 join 操作时,mysql是如何工作的。常见的 join 方式有哪些?如
- # 源码如下:#!/usr/bin/env python#coding=utf-8import osfrom PIL import Imag
- 代码之余,将代码过程重要的一些代码段备份一下,如下的代码内容是关于Python从ftp服务器下载文件的的代码,希望能对小伙伴有用途。#cod
- PyCharm是Python著名的Python集成开发环境(IDE)conda有Miniconda和Anaconda,前者应该是类似最小化版
- 利用FSO取得BMP,JPG,PNG,GIF文件信息:大小,宽、高尺寸等 ’:::::::::::::::::::::::::::
- 在pandas里面常用value_counts确认数据出现的频率。1. Series 情况下:pandas 的 value_counts()
- 1、应该将 CSS 放置于结构的上方(一般放置于 head 元素内)。CSS 是解释型语言,Firefox 和 IE 在等待 CSS 传输完
- 方法一: 在asp.net的aspx里面的源代码中 <input type="button onclick="ja