鱼C论坛

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

[技术交流] cookbook 1.20

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

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

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

x

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

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

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

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

  5. c["z"] = 4
  6. c["w"] = 5
  7. print(c)
  8. del c["y"]
  9. print(c)
  10. del c["x"]
  11. 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对于作用域的值配合很好
  1. var = ChainMap()
  2. var["x"] = 1
  3. var = var.new_child()  # 添加新映射
  4. var["x"] = 2
  5. var = var.new_child()  # 添加新映射
  6. var["x"] = 3

  7. print(var, len(var))
  8. print(var["x"])
  9. var = var.parents
  10. print(var["x"])
  11. var = var.parents
  12. print(var["x"])
  13. var = var.parents
  14. print(var)
复制代码
parents 相当于pop
ChainMap({'x': 3}, {'x': 2}, {'x': 1}) 1
3  <-最后一次赋值(最后孙子)
2
1  <-最初一次赋值(爷爷)
ChainMap({})


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


本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 12:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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