侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python ChainMap的使用和说明详解

Python  /  管理员 发布于 7年前   170

ChainMap是Python collections模块中的一个成员,它用来将多个map组合到一起。Chain是链条的意思,字面意思就是把map串联到一起。

问题的背景是我们有多个字典或者映射,想把它们合并成为一个单独的映射,有人说可以用update进行合并,这样做的问题就是新建了一个数据结构以致于当我们对原来的字典进行更改的时候不会同步。如果想建立一个同步的查询方法,可以使用ChainMap

先看一下初步使用

from collections import ChainMapa = {"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]: cOut[9]: ChainMap({'z': 3, 'x': 1}, {'z': 4, 'y': 2})In [10]: c["z"]Out[10]: 3In [11]: c["z"] = 4In [12]: cOut[12]: ChainMap({'z': 4, 'x': 1}, {'z': 4, 'y': 2})In [13]: c.pop('z')Out[13]: 4In [14]: cOut[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"]=1In [6]: aOut[6]: ChainMap({'x': 1})In [7]: b = a.new_child()In [8]: bOut[8]: ChainMap({}, {'x': 1})In [9]: b["x"] = 2In [10]: bOut[10]: ChainMap({'x': 2}, {'x': 1})In [11]: b["y"] = 3In [12]: bOut[12]: ChainMap({'x': 2, 'y': 3}, {'x': 1})In [13]: aOut[13]: ChainMap({'x': 1})In [14]: c = a.new_child()In [15]: cOut[15]: ChainMap({}, {'x': 1})In [16]: c["x"]Out[16]: 1In [17]: c["y"] = 1In [18]: cOut[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 callableIn [20]: d = c.parentsIn [21]: dOut[21]: ChainMap({'x': 1})In [22]: d is aOut[22]: FalseIn [23]: d == aOut[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]: cOut[27]: ChainMap({'x': 1, 'z': 3}, {'y': 2, 'z': 4})In [28]: c.mapsOut[28]: [{'x': 1, 'z': 3}, {'y': 2, 'z': 4}]In [29]: c.parentsOut[29]: ChainMap({'y': 2, 'z': 4})In [30]: c.parents.mapsOut[30]: [{'y': 2, 'z': 4}]In [31]: c.parents.parentsOut[31]: ChainMap({})In [32]: c.parents.parents.parentsOut[32]: ChainMap({})

也正是因为底层是列表实现的,所以实际上ChainMap查询的字典实际上还是原来的字典的引用

ChainMap文档和示例:https://docs.python.org/3/library/collections.html#collections.ChainMap

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    python 求一个列表中所有元素的乘积实例
    下一条:
    python 计算一个字符串中所有数字的和实例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客