Python Chainmap函数 - Python零基础入门教程

目录

零基础 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 函数

本文由博客 - 猿说编程 猿说编程 发布!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容