Python Chainmap函数

零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门

一.前言

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

       Python 内置函数 ChainMap 可以将多个字典合并为一个独有的字典,这样的操作 并不是对源数据的拷贝,而是指向源数据,假如原字典数据修改,ChainMap 映射也会改变;如果对 ChainMap 的结果修改,那么原数据一样也会被修改,这样就不会造成数据不同步的问题,当然需要因使用场景而定。


二.Python ChainMap合并多个字典

       使用 ChainMap 可以将多个字典 dict 串联起来,当做一个字典 dict 来处理,示例代码如下:

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python Chainmap函数.py
@Time:2021/3/21 23:00
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
 
"""

from collections import ChainMap

dict1= {"a":"zhangsan","b":"lisi"}
dict2= {"c":"wangwu"}
dict3= {"d":"liqui","e":"laowang"}

new_dict = ChainMap(dict1,dict2,dict3)
print(new_dict)
print(type(new_dict))

'''
输出结果:
ChainMap({'a': 'zhangsan', 'b': 'lisi'}, {'c': 'wangwu'}, {'d': 'liqui', 'e': 'laowang'})
<class 'collections.ChainMap'>
'''

三.Python ChainMap查询和遍历

       ChainMap 函数将多个字典 dict 合并为一个字典 dict ,查询和遍历的方式和对普通字典 dict 的操作方式一样,示例代码如下:


# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python Chainmap函数.py
@Time:2021/3/21 23:00
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
 
"""

from collections import ChainMap

dict1= {"a":"zhangsan","b":"lisi"}
dict2= {"c":"wangwu"}
dict3= {"d":"liqui","b":"laowang"}

new_dict = ChainMap(dict1,dict2,dict3)

# 查询,可以直接根据key值查新,和字典操作方式一样
print(new_dict["a"])
print(new_dict["b"]) #当多个字典中有相同的key值是,默认取第一个key对应的value
print(new_dict["c"])

print("***"*20)
# 遍历,可以直接根据key或者value遍历,和普通字典一样操作
for key,value in new_dict.items():
    print(key,":",value)

'''
输出结果:
zhangsan 
lisi 
wangwu 
************************************************************ 
e : laowang 
c : wangwu 
d : liqui 
a : zhangsan 
b : lisi

'''

       注意:如果在使用ChainMap合并多个字典时,字典中有重复的 key 值,默认取第一个字典中 key 对应的 value ,从原理上面讲,ChainMap 实际上是把放入的字典存储在一个队列中,当进行字典的增加删除等操作只会在第一个字典上进行,当进行查找的时候会依次查找!


四.Python ChainMap修改

       maps 方法会将串联起来的字典以列表的形式展示,示例代码如下:

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python Chainmap函数.py
@Time:2021/3/21 23:00
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
 
"""

from collections import ChainMap

dict1= {"a":"zhangsan","b":"lisi"}
dict2= {"c":"wangwu"}
dict3= {"d":"liqui","b":"laowang"}

new_dict = ChainMap(dict1,dict2,dict3)
print("new_dict修改数据之后:",new_dict)
print("dict1修改数据之前:",dict1)

# 操作列表中索引值为0的字典,修改key="a"对应的value
new_dict.maps[0]["a"]=18

print("new_dict修改数据之后:",new_dict)
print("dict1修改数据之后:",dict1)

'''
输出结果:
new_dict修改数据之后: ChainMap({'a': 'zhangsan', 'b': 'lisi'}, {'c': 'wangwu'}, {'d': 'liqui', 'b': 'laowang'})
dict1修改数据之前: {'a': 'zhangsan', 'b': 'lisi'}
new_dict修改数据之后: ChainMap({'a': 18, 'b': 'lisi'}, {'c': 'wangwu'}, {'d': 'liqui', 'b': 'laowang'})
dict1修改数据之后: {'a': 18, 'b': 'lisi'}

'''

       注意:ChainMap 使用就是原始字典,共用同一内存地址,因此原始数据修改,ChainMap 映射也会改变;如果对 ChainMap 的结果修改,那么原数据一样也会被修改


五.Python ChainMap增加

       可以通过 new_child() 函数添加一个新的空白字典,然后像普通字典一样操作添加数据,示例代码如下:

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python Chainmap函数.py
@Time:2021/3/21 23:00
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
 
"""

from collections import ChainMap

dict1= {"a":"zhangsan","b":"lisi"}
dict2= {"c":"wangwu"}

# 合并字典
new_dict = ChainMap(dict1,dict2)
print(new_dict)

# 添加数据
new_dict1 = new_dict.new_child()
print(new_dict1)
new_dict1["x"]=0
new_dict1["y"] = 100.0
print(new_dict1)


'''
输出结果:
ChainMap({'a': 'zhangsan', 'b': 'lisi'}, {'c': 'wangwu'})
ChainMap({}, {'a': 'zhangsan', 'b': 'lisi'}, {'c': 'wangwu'})
ChainMap({'x': 0, 'y': 100.0}, {'a': 'zhangsan', 'b': 'lisi'}, {'c': 'wangwu'})

'''

六.Python ChainMap 重点总结

  • 1、ChainMap 可接受多个映射然后在逻辑上使它们表现为一个单独的映射结构;它只是维护了一个记录底层映射关系的列表,然后去重定义常用的字典操作;
  • 2、如果有重复的键,会采用第一个映射中多对应的值;
  • 3、修改 ChainMap 映射结构,会同时作用在自己和原始字典结构上;
  • 4、可以使用字典的 update() 方法,来替代上面的合并方案;但是这就需要创建一个新的字典对象(或者修改原字典,破坏了原始数据),并且原始字典做了修改,并不会反映到新建的字典上;
  • 5、ChainMap 使用的就是原始字典,因此原字典变,它也会改变。

七.猜你喜欢

  1. Python 简介
  2. Python Pycharm Anacanda 区别
  3. Python2.x 和 Python3.x,如何选择?
  4. Python 配置环境
  5. Python Hello World入门
  6. Python 代码注释
  7. Python 中文编码
  8. Anaconda是什么?Anconda下载安装教程
  9. Pycharm 提示:this license **** has been cancelled
  10. Pycharm设置开发模板/字体大小/背景颜色

未经允许不得转载:猿说编程 » Python Chainmap函数
喜欢(3) 打赏

评论抢沙发

不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!!

开始学习

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏