目录
- 一.前言
- 二.Python ChainMap 合并多个字典
- 三.Python ChainMap 查询和遍历
- 四.Python ChainMap 修改
- 五.Python ChainMap 增加
- 六.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 使用的就是原始字典,因此原字典变,它也会改变。
七.猜你喜欢
未经允许不得转载:猿说编程 » Python Chainmap 函数
本文由博客 - 猿说编程 猿说编程 发布!
来源:https://www.cnblogs.com/shuopython/p/14988210.html
图文来源于网络,如有侵权请联系删除。