ChainMap 的使用和说明

学Python,用RPA

艺赛旗RPA2020.1版本 正在免费下载使用中,欢迎下载

​www.i-search.com.cn

问题的背景是我们有多个字典或者映射,想把它们合并成为一个单独的映射,有人说可以用 update 进行合并,这样做的问题就是新建了一个数据结构以致于当我们对原来的字典进行更改的时候不会同步。如果想建立一个同步的查询方法,可以使用 ChainMap。先看一下初步使用:from collections import ChainMap
a = {“x”:1, “z”:3}
b = {“y”:2, “z”:4}
c = ChainMap(a,b)
print©
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这是 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

In [20]: d
Out[20]: ChainMap({‘x’: 1})

In [21]: d is a
Out[21]: False

In [22]: d == a
Out[22]: 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 查询的字典实际上还是原来的字典的引用。因此对 maps 之后的结果进行修改也会反映到原来的字典中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值