Python中ChainMap用法

Python中,ChainMap是一个合并多个字典或映射的工具,使它们像一个单一的字典一样访问。ChainMap在collections模块中提供。

以下是ChainMap的基本用法:

from collections import ChainMap

# 创建字典1
dict1 = {'a': 1, 'b': 2}

# 创建字典2
dict2 = {'b': 3, 'c': 4}

# 创建 ChainMap
chain_map = ChainMap(dict1, dict2)

# 访问元素
print(chain_map['a'])  # 输出: 1
print(chain_map['b'])  # 输出: 2,因为在第一个字典中找到了'b'

# 新增元素
chain_map['d'] = 5

# 打印合并后的字典
print(chain_map)
# 输出: ChainMap({'a': 1, 'b': 2, 'd': 5}, {'b': 3, 'c': 4})

# 获取所有的键
print(list(chain_map.keys()))
# 输出: ['b', 'c', 'a', 'd']

# 获取所有的值
print(list(chain_map.values()))
# 输出: [2, 4, 1, 5]

# 获取所有的键值对
print(list(chain_map.items()))
# 输出: [('b', 2), ('c', 4), ('a', 1), ('d', 5)]

在上面的例子中,ChainMap合并了两个字典,并且可以像访问单一字典一样访问合并后的结果。如果键存在于多个字典中,它将返回第一个找到的键对应的值。此外,对ChainMap的修改会反映在原始字典中。

ChainMap在处理配置文件、命令行参数和默认值等场景时特别有用,因为它允许你轻松地组合多个映射。

ChainMap是一个隐藏的宝石,用于将多个字典组合成无缝覆盖,非常适合建立设置的层次结构。 当您有级联的首选项时,例如覆盖环境变量的命令行参数,这反过来又胜过默认值时,它特别方便。

优于`combined = {**defaults,**os.environ,** blog_args}`三个原因:

  • 动态与静态:ChainMap反映了底层字典的变化,而合并字典是合并时的静态快照。
  • 内存效率和性能:ChainMap的内存效率更高,创建速度更快,因为它不涉及将数据复制到新字典中(当源字典更大时,这是一个优势)。
  • 显式优于隐式:与dict合并相比,ChainMap使优先顺序显式且易于修改。

其实就是LinkedHashMap