python中map函数字典映射_python Chainmap函数(19)

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

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

一.ChainMap合并多个字典

使用ChainMap可以将多个字典串联起来,当做一个字典来处理。

#!usr/bin/env python#-*- coding:utf-8 _*-

"""@Author:何以解忧

@Blog(个人博客地址): shuopython.com

@WeChat Official Account(微信公众号):猿说python

@Github:www.github.com

@File:python_chainmap.py

@Time:2019/11/20 21:25

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

from collections importChainMap

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'})

二.ChainMap查询和遍历

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

from collections importChainMap

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 innew_dict.items():print(key,":",value)

输出结果:

zhangsan

lisi

wangwu************************************************************e : laowang

c : wangwu

d : liqui

a : zhangsan

b : lisi

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

三.ChainMap修改

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

from collections importChainMap

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的结果修改,那么原数据一样也会被修改

四.ChainMap增加

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

from collections importChainMap

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'})

总结:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值