|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
|
|