鱼C论坛

 找回密码
 立即注册
查看: 1259|回复: 0

[技术交流] cookbook 1.20

[复制链接]
发表于 2022-1-20 22:50:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

将多个映射合并为一个映射

问题描述:
        我们有多个字典,想在逻辑上将其合并成为一个单独的映射结构

一、ChainMap函数       
a = {"x": 1, "y": 2}
b = {"z": 3, "y": 3}

c = ChainMap(a, b)
print(c, len(c), list(c.values()))

c["z"] = 4
c["w"] = 5
print(c)
del c["y"]
print(c)
del c["x"]
print(c)
ChainMap({'x': 1, 'y': 2}, {'z': 3, 'y': 3})
3
[3, 2, 1]
ChainMap({'x': 1, 'y': 2, 'z': 4, 'w': 5}, {'z': 3, 'y': 3})
ChainMap({'x': 1, 'z': 4, 'w': 5}, {'z': 3, 'y': 3})
ChainMap({'z': 4, 'w': 5}, {'z': 3, 'y': 3})

相同的键会覆盖,最终的值取决于第一个参数,比如上面就取决于a字典的值
修改映射操作总是作用到第一个参数,比如上面就只在左边的字典进行增删改

二、Chainmap对于作用域的值配合很好
var = ChainMap()
var["x"] = 1
var = var.new_child()  # 添加新映射
var["x"] = 2
var = var.new_child()  # 添加新映射
var["x"] = 3

print(var, len(var))
print(var["x"])
var = var.parents
print(var["x"])
var = var.parents
print(var["x"])
var = var.parents
print(var)
parents 相当于pop
ChainMap({'x': 3}, {'x': 2}, {'x': 1}) 1
3  <-最后一次赋值(最后孙子)
2
1  <-最初一次赋值(爷爷)
ChainMap({})


三、与原生字典的update方法对比
普通的字典也可以通过updata进行上述操作,但是后续任何对原字典的任何操作都不会影响到合并后的字典
a = {"x": 1, "y": 2}
b = {"z": 3, "y": 3}
c = b
c.update(a)
d = ChainMap(a, b)
a["w"] = 50
print(c.values(), len(c))
print(list(d.values()), len(d))
dict_values([3, 2, 1]) 3
[3, 2, 1, 50] 4


本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 20:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表