目录
前言
认识ChainMap
访问ChainMap的键值
为ChainMap添加新映射
本文小结
首页 后端开发 Python教程 Python编程:换种方式用字典之链式映射(ChainMap),盘它!

Python编程:换种方式用字典之链式映射(ChainMap),盘它!

Apr 11, 2023 pm 03:04 PM
python 容器 映射

前言

集合是专门的容器数据类型(Container Datatype),可以替代Python的通用内置容器,如dict、list、set和tuple。容器是一种特殊用途的对象,可用于存储不同的对象。它提供了一种访问所包含对象并遍历它们的方法。

Python提供了实现容器数据类型的collections模块。在章节系列中,我们将学习集合模块中的不同类型集合融洽,其中包括:

  • ChainMap
  • Counter
  • Deque
  • DefaultDict
  • NamedTuple
  • OrderedDict
  • UserDict
  • UserList
  • UserString

下面就来分别介绍这些容器类型——链式映射(ChainMap)。

认识ChainMap

Python的所提供的ChainMap类(就称为链映射类),是个类似字典(dict)的类,用于快速链接许多个映射,以便将它们作为单个单元处理。它通常比创建一个新字典并运行多个update()调用要快得多。

其语法格式如下:

xchainMap = collections.ChainMap(*maps)

说明:语法格式中的collections是导入的完成模块名称。如果这样导入该模块:import collections as cts,则语法可变为:class cts.ChainMap(*maps),或则模糊导入:from collections import ChainMap,这样可以修改为:ChainMap(*maps)。

ChainMap可将多个字典或其他映射组合在一起,创建一个单一的、可更新的视图(字典列表)。如果没有指定映射,则提供一个空字典,以便新的链式映射(ChainMap)总是至少有一个映射可以。

链映射的底层映射存储在一个列表中。该列表是公共的,可以使用maps属性来访问或更新。除了maps属性,链映射没有其他的新扩展状态。

ChainMap是通过引用来合并底层映射的。因此,如果其中一个底层映射得到更新,这些更改也将反映在ChainMap中。

链映射支持所有常用的字典(dict)方法。此外,还有一个maps属性,用于创建新子上下文的方法,并且除了第一个映射,属性maps可用于访问所有映射——maps是个列表。

对应一个用户可更新的映射列表,该列表从第一次搜索到最后一次搜索是有序的。它是唯一存储的状态,可以通过修改来更改要搜索的映射。这样的列表应该始终至少包含一个映射。

来看下面的简单示例,代码清单如下:

Python编程:换种方式用字典之链式映射(ChainMap),盘它!

运行程序输出结果如下:

ChainMap({'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'})
[{'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'}]
登录后复制

上述清单中,我们用两个字典定义一个ChainMap对象(chain_map)。然后我们打印输出ChainMap对象和maps属性。正如在输出中看到的,结果是这些字典的构成视图。

访问ChainMap的键值

我们可以通过使用keys()和values()方法来访问ChainMap的键和值。代码示例如下:

Python编程:换种方式用字典之链式映射(ChainMap),盘它!

上述代码输出结果为:

KeysView(ChainMap({'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'}))
ValuesView(ChainMap({'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'}))
登录后复制

如程序输出结果所示,chain_map.keys()的结果是一个KeysView(键视图),chain_map.values()的结果是一个ValuesView(值视图)。这两个视图类型内置类,都是可迭代对象,可以分别遍历相应的键名和值对象。例如:

Python编程:换种方式用字典之链式映射(ChainMap),盘它!

输出结果为:

key = a,value=A
key = b,value=B
key = one,value=1
key = two,value=2
链映射包含的值为:
A;B;1;2;
登录后复制

结合代码和输出结果,很容易理解,即链式映射就是把多个映射(map有很多实现,字典是其中的一种)打包成一个映射即链式映射,然后可以像操作字典样操作访问。比如像字典一样这样来访问某个键的值:

print(chain_map['b'] )
登录后复制

也就是通过使用键名:chain_map[' one ']来访问ChainMap底层字典中单个项的值。

为ChainMap添加新映射

ChainMap可以包含任意数量的字典。我们使用内置的new_child()方法向ChainMap添加新字典。new_child()方法返回一个新的ChainMap,其中包含着新映射,后跟当前实例中的所有映射。这里需要注意的一点是,新添加的字典将放在ChainMap的开头。来看示例:

Python编程:换种方式用字典之链式映射(ChainMap),盘它!

运行程序,输入结果如下:

Old: ChainMap({'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'})
New: ChainMap({'x': 0, 'y': 1}, {'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'})
登录后复制

这里需要注意的是,用链式映射的new_child()方法添加新字典后,不改变原来的链映射,会返回一个新的ChainMap对象。另外,如果你修改链式映射所包含的映射或字典,变化也将体现在链式映射对象中。

另外,实践中要当心:如果你按照字典操作来添加新的键值对,则该键值对会添加到链式映射所包含的第一个映射中,如:new_chain_map['X'] = 'Unkown' 。自己动手试试看。

所含映射有相同键怎么办?

底层上,链式映射主要是为把多个字典或映射打包成一个映射,以便集中操作。如果所办函的字典中有相同的键会怎样呢?来看示例:

Python编程:换种方式用字典之链式映射(ChainMap),盘它!

运行程序输出结果如下:

ChainMap({'id': 21001, 'country': '大秦', 'emperor': '嬴政'}, {'name': '李靖', 'country': '大唐', 'title': '元帅'})
大秦
('name', '李靖')
('country', '大秦')
('title', '元帅')
('id', 21001)
('emperor', '嬴政')
登录后复制

很显然,链接的映射中出现相同字典项时,只读取第一个,以第一个为准,而且当你更新一个键的值时,它也只是更新第一个映射内容的键值。

如果你想一次更新所有映射中的相同键的值怎么办呢?你可以自定义一个ChainMap子类来实现,或定义更新方法。因为ChainMap中有个属性maps持有完整的各个映射,可以基于此属性来完成相同键的一次性更新。这里简单给个通过方法的方式实现多映射相同键的一次更新。示例代码如下:

Python编程:换种方式用字典之链式映射(ChainMap),盘它!

当然,你可以写得更复杂一点,以完成更多的需要,也可实现一次多个映射中的相同键的值。自己动手试试吧。

本文小结

本文主要介绍了Python集合模块中的链式映射容器——ChainMap的使用,可以把多个字典打包成一个对象来操作。同时需要注意的是,该映射只是对原字典的引用,当你修改原字典时,相应的变化也为体现在链式映射中。同时,在为ChainMap新增新的键值对时,它会添加到所包含的第一个映射对象中。

以上是Python编程:换种方式用字典之链式映射(ChainMap),盘它!的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

xml格式怎么打开 xml格式怎么打开 Apr 02, 2025 pm 09:00 PM

用大多数文本编辑器即可打开XML文件;若需更直观的树状展示,可使用 XML 编辑器,如 Oxygen XML Editor 或 XMLSpy;在程序中处理 XML 数据则需使用编程语言(如 Python)与 XML 库(如 xml.etree.ElementTree)来解析。

有没有免费的手机XML转PDF工具? 有没有免费的手机XML转PDF工具? Apr 02, 2025 pm 09:12 PM

没有简单、直接的免费手机端XML转PDF工具。需要的数据可视化过程涉及复杂的数据理解和渲染,市面上所谓的“免费”工具大多体验较差。推荐使用电脑端的工具或借助云服务,或自行开发App以获得更靠谱的转换效果。

有什么手机APP可以将XML转换成PDF? 有什么手机APP可以将XML转换成PDF? Apr 02, 2025 pm 08:54 PM

无法找到一款将 XML 直接转换为 PDF 的应用程序,因为它们是两种根本不同的格式。XML 用于存储数据,而 PDF 用于显示文档。要完成转换,可以使用编程语言和库,例如 Python 和 ReportLab,来解析 XML 数据并生成 PDF 文档。

XML修改内容需要编程吗 XML修改内容需要编程吗 Apr 02, 2025 pm 06:51 PM

修改XML内容需要编程,因为它需要精准找到目标节点才能增删改查。编程语言有相应库来处理XML,提供API像操作数据库一样进行安全、高效、可控的操作。

xml格式化工具推荐 xml格式化工具推荐 Apr 02, 2025 pm 09:03 PM

XML格式化工具可以将代码按照规则排版,提高可读性和理解性。选择工具时,要注意自定义能力、对特殊情况的处理、性能和易用性。常用的工具类型包括在线工具、IDE插件和命令行工具。

xml格式如何美化 xml格式如何美化 Apr 02, 2025 pm 09:57 PM

XML 美化本质上是提高其可读性,包括合理的缩进、换行和标签组织。其原理是通过遍历 XML 树,根据层级增加缩进,并处理空标签和包含文本的标签。Python 的 xml.etree.ElementTree 库提供了方便的 pretty_xml() 函数,可以实现上述美化过程。

怎么在手机上把XML文件转换为PDF? 怎么在手机上把XML文件转换为PDF? Apr 02, 2025 pm 10:12 PM

不可能直接在手机上用单一应用完成 XML 到 PDF 的转换。需要使用云端服务,通过两步走的方式实现:1. 在云端转换 XML 为 PDF,2. 在手机端访问或下载转换后的 PDF 文件。

手机上如何将XML转换成PDF? 手机上如何将XML转换成PDF? Apr 02, 2025 pm 10:18 PM

直接在手机上将XML转换为PDF并不容易,但可以借助云端服务实现。推荐使用轻量级手机App上传XML文件并接收生成的PDF,配合云端API进行转换。云端API使用无服务器计算服务,选择合适的平台至关重要。处理XML解析和PDF生成时需要考虑复杂性、错误处理、安全性和优化策略。整个过程需要前端App与后端API协同工作,需要对多种技术有所了解。

See all articles