Python 字典和集合(字典的变种)

本章内容的大纲如下:

常见的字典方法

如何处理查找不到的键

标准库中 dict 类型的变种set 和 frozenset 类型

散列表的工作原理

散列表带来的潜在影响(什么样的数据类型可作为键、不可预知的

顺序,等等)

字典的变种

这一节总结了标准库里 collections 模块中,除了 defaultdict 之外

的不同映射类型。
collections.OrderedDict

这个类型在添加键的时候会保持顺序,因此键的迭代次序总是一致

的。OrderedDict 的 popitem 方法默认删除并返回的是字典里的最后

一个元素,但是如果像 my_odict.popitem(last=False) 这样调用

它,那么它删除并返回第一个被添加进去的元素。

collections.ChainMap

该类型可以容纳数个不同的映射对象,然后在进行键查找操作的时

候,这些对象会被当作一个整体被逐个查找,直到键被找到为止。这个

功能在给有嵌套作用域的语言做解释器的时候很有用,可以用一个映射

对象来代表一个作用域的上下文。在 collections 文档介绍 ChainMap

对象的那一部分

https://docs.python.org/3/library/collections.html#collections.ChainMap)

里有一些具体的使用示例,其中包含了下面这个 Python 变量查询规则的

代码片段:

复制代码
import builtins
pylookup = ChainMap(locals(), globals(), vars(builtins))

collections.Counter

这个映射类型会给键准备一个整数计数器。每次更新一个键的时候

都会增加这个计数器。所以这个类型可以用来给可散列表对象计数,或

者是当成多重集来用------多重集合就是集合里的元素可以出现不止一

次。Counter 实现了 + 和 - 运算符用来合并记录,还有像

most_common([n]) 这类很有用的方法。most_common([n]) 会按照次

序返回映射里最常见的 n 个键和它们的计数,详情参阅文档

https://docs.python.org/3/library/collections.html#collections.Counter)。

下面的小例子利用 Counter 来计算单词中各个字母出现的次数:

复制代码
>>> ct = collections.Counter('abracadabra')
>>> ct
Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
>>> ct.update('aaaaazzz')
>>> ct
Counter({'a': 10, 'z': 3, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
>>> ct.most_common(2)
[('a', 10), ('z', 3)]

colllections.UserDict

这个类其实就是把标准 dict 用纯 Python 又实现了一遍。

跟 OrderedDict、ChainMap 和 Counter 这些开箱即用的类型不

同,UserDict 是让用户继承写子类的。下面就来试试。

相关推荐
俺不是西瓜太郎´•ﻌ•`6 分钟前
二维差分数组(JAVA)蓝桥杯
java·开发语言·蓝桥杯
go_bai7 分钟前
C++——继承
开发语言·c++·笔记·学习·学习方法
cainiao08060511 分钟前
Java大数据可视化在城市空气质量监测与污染溯源中的应用:GIS与实时数据流的技术融合
java·开发语言·信息可视化
2685725913 分钟前
Java 23种设计模式 - 行为型模式11种
java·开发语言·设计模式
胡耀超15 分钟前
从逻辑学视角理解统计学在数据挖掘中的作用
人工智能·python·数据挖掘·统计学·逻辑学
White_Can16 分钟前
《C++探幽:模板从初阶到进阶》
开发语言·c++
不会飞的鲨鱼20 分钟前
Windows系统下【Celery任务队列】python使用celery 详解(二)
开发语言·windows·python
南玖yy27 分钟前
内存安全暗战:从 CVE-2025-21298 看 C 语言防御体系的范式革命
c语言·开发语言·人工智能·struts·安全·架构·交互
编程点滴路32 分钟前
LinkedList源码解析
java·开发语言
喂我花生(๑•̀ㅂ•́)و✧1 小时前
JAVA中ArrayList的解析
java·开发语言·算法