You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

56 lines
2.8KB

  1. """
  2. 1、ChainMap是什么
  3. ChainMap最基本的使用,可以用来合并两个或者更多个字典,当查询的时候,从前往后依次查询。
  4. ChainMap:将多个字典视为一个,解锁Python超能力。
  5. ChainMap是由Python标准库提供的一种数据结构,允许你将多个字典视为一个。换句话说:ChainMap是一个基于多dict的可更新的视图,它的行为就像一个普通的dict。
  6. ChainMap类用于快速链接多个映射,以便将它们视为一个单元。它通常比创建新字典和多次调用update()快得多。
  7. 你以前可能从来没有听说过ChainMap,你可能会认为ChainMap的使用情况是非常特定的。坦率地说,你是对的。
  8. 我知道的用例包括:
  9. 通过多个字典搜索
  10. 提供链缺省值
  11. 经常计算字典子集的性能关键的应用程序
  12. 2、特性
  13. 1)找到一个就不找了:这个列表是按照第一次搜索到最后一次搜索的顺序组织的,搜索查询底层映射,直到一个键被找到。
  14. 2)更新原始映射:不同的是,写,更新和删除只操作第一个映射。
  15. 3)支持所有常用字典方法。
  16. 简而言之ChainMap:将多个字典视为一个,解锁Python超能力。
  17. Python标准库中的集合模块包含许多为性能而设计的实用的数据结构。著名的包括命名元组或计数器。
  18. 今天,通过实例,我们来看看鲜为人知的ChainMap。通过浏览具体的示例,我希望给你一个提示,关于在更高级的Python工作中使用ChainMap将如何从中受益。
  19. """
  20. from collections import ChainMap
  21. baseline = {'music': 'bach', 'art': 'rembrandt'}
  22. adjustments = {'art': 'van gogh', 'opera': 'carmen'}
  23. test = ChainMap(adjustments, baseline)
  24. print(test)
  25. test1 = list(ChainMap(adjustments, baseline))
  26. print(test1)
  27. # 存在重复元素时,也不会去重
  28. dcic1 = {'label1': '11', 'label2': '22'}
  29. dcic2 = {'label2': '22', 'label3': '33'}
  30. dcic3 = {'label4': '44', 'label5': '55'}
  31. last = ChainMap(dcic1, dcic2, dcic3)
  32. print(last)
  33. print(last['label2'])
  34. """
  35. new_child()方法
  36. 用法:new_child(m=None)
  37. 返回一个新的ChainMap类,包含了一个新映射(map),后面跟随当前实例的全部映射map。
  38. 如果m被指定,它就成为不同新的实例,就是在所有映射前加上 m,如果没有指定,就加上一个空字典,
  39. 这样的话一个 d.new_child() 调用等价于ChainMap({}, *d.maps) 。这个方法用于创建子上下文,不改变任何父映射的值。
  40. """
  41. aa = last.new_child(m={'key_new': 888})
  42. print(aa)
  43. """
  44. parents属性
  45. 属性返回一个新的ChainMap包含所有的当前实例的映射,除了第一个。
  46. 这样可以在搜索的时候跳过第一个映射。使用的场景类似在 nested scopes 嵌套作用域中使用nonlocal关键词。
  47. 用例也可以类比内建函数super() 。一个d.parents 的引用等价于ChainMap(*d.maps[1:])。
  48. """
  49. print(aa.parents)