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