Python 字典和集合(常见的映射方法)

news2025/4/18 3:42:32

本章内容的大纲如下:
常见的字典方法
如何处理查找不到的键
标准库中 dict 类型的变种set 和 frozenset 类型
散列表的工作原理
散列表带来的潜在影响(什么样的数据类型可作为键、不可预知的
顺序,等等)

常见的映射方法

映射类型的方法其实很丰富。表 3-1 为我们展示了
dict、defaultdict 和 OrderedDict 的常见方法,后面两个数据类型
是 dict 的变种,位于 collections 模块内。

表3-1:dict、collections.defaultdict和
collections.OrderedDict这三种映射类型的方法列表(依然省略
了继承自object的常见方法);可选参数以[…]表示

image

  • default_factory 并不是一个方法,而是一个可调用对象(callable),它的值在
    defaultdict 初始化的时候由用户设定。

#OrderedDict.popitem() 会移除字典里最先插入的元素(先进先出);同时这个方法还有一
个可选的 last 参数,若为真,则会移除最后插入的元素(后进先出)。

上面的表格中,update 方法处理参数 m 的方式,是典型的“鸭子类
型”。函数首先检查 m 是否有 keys 方法,如果有,那么 update 函数就
把它当作映射对象来处理。否则,函数会退一步,转而把 m 当作包含了
键值对 (key, value) 元素的迭代器。Python 里大多数映射类型的构造
方法都采用了类似的逻辑,因此你既可以用一个映射对象来新建一个映
射对象,也可以用包含 (key, value) 元素的可迭代对象来初始化一个
映射对象。

在映射对象的方法里,setdefault 可能是比较微妙的一个。我们虽然
并不会每次都用它,但是一旦它发挥作用,就可以节省不少次键查询,
从而让程序更高效。如果你对它还不熟悉,下面我会通过一个实例来讲
解它的用法。

用setdefault处理找不到的键
当字典 d[k] 不能找到正确的键的时候,Python 会抛出异常,这个行为
符合 Python 所信奉的“快速失败”哲学。也许每个 Python 程序员都知道
可以用 d.get(k, default) 来代替 d[k],给找不到的键一个默认的
返回值(这比处理 KeyError 要方便不少)。但是要更新某个键对应的值的时候,不管使用 getitem 还是 get 都会不自然,而且效率
低。就像示例 3-2 中的还没有经过优化的代码所显示的那
样,dict.get 并不是处理找不到的键的最好方法。

示例 3-2 是由 Alex Martelli 举的一个例子 变化而来,例子生成的索引
跟示例 3-3 显示的一样。

示例 3-2 index0.py 这段程序从索引中获取单词出现的频率信
息,并把它们写进对应的列表里(更好的解决方案在示例 3-4 中)

"""创建一个从单词到其出现情况的映射"""
import sys
import re
WORD_RE = re.compile(r'\w+')
index = {}
with open(sys.argv[1], encoding='utf-8') as fp:
  for line_no, line in enumerate(fp, 1):
    for match in WORD_RE.finditer(line):
    word = match.group()
    column_no = match.start()+1
    location = (line_no, column_no)
# 这其实是一种很不好的实现,这样写只是为了证明论点
occurrences = index.get(word, []) ➊
occurrences.append(location) ➋
index[word] = occurrences ➌
# 以字母顺序打印出结果
for word in sorted(index, key=str.upper): ➍
    print(word, index[word])

❶ 提取 word 出现的情况,如果还没有它的记录,返回 []。
❷ 把单词新出现的位置添加到列表的后面。
❸ 把新的列表放回字典中,这又牵扯到一次查询操作。
❹ sorted 函数的 key= 参数没有调用 str.uppper,而是把这个方法
的引用传递给 sorted 函数,这样在排序的时候,单词会被规范成统一
格式。

示例 3-3 这里是示例3-2 的不完全输出,每一行的列表都代表一
个单词的出现情况,列表中的元素是一对值,第一个值表示出现的
行,第二个表示出现的列

$ python3 index0.py ../../data/zen.txt
a [(19, 48), (20, 53)]
Although [(11, 1), (16, 1), (18, 1)]
ambiguity [(14, 16)]
and [(15, 23)]
are [(21, 12)]
aren [(10, 15)]
at [(16, 38)]
bad [(19, 50)]
be [(15, 14), (16, 27), (20, 50)]
beats [(11, 23)]
Beautiful [(3, 1)]
better [(3, 14), (4, 13), (5, 11), (6, 12), (7, 9), (8, 11),
(17, 8), (18, 25)]
...

示例 3-2 里处理单词出现情况的三行,通过 dict.setdefault 可以只
用一行解决。示例 3-4 更接近 Alex Martelli 自己举的例子。

示例 3-4 index.py 用一行就解决了获取和更新单词的出现情况列
表,当然跟示例 3-2 不一样的是,这里用到了 dict.setdefault

"""创建从一个单词到其出现情况的映射"""
import sys
import re
WORD_RE = re.compile(r'\w+')
index = {}
with open(sys.argv[1], encoding='utf-8') as fp:
    for line_no, line in enumerate(fp, 1):
      for match in WORD_RE.finditer(line):
      word = match.group()
column_no = match.start()+1
      location = (line_no, column_no)
      index.setdefault(word, []).append(location) ➊
# 以字母顺序打印出结果
for word in sorted(index, key=str.upper):
    print(word, index[word])

➊ 获取单词的出现情况列表,如果单词不存在,把单词和一个空列表
放进映射,然后返回这个空列表,这样就能在不进行第二次查找的情况
下更新列表了。

也就是说,这样写:

my_dict.setdefault(key, []).append(new_value)

跟这样写:

if key not in my_dict:
my_dict[key] = []
my_dict[key].append(new_value)

二者的效果是一样的,只不过后者至少要进行两次键查询——如果键不
存在的话,就是三次,用 setdefault 只需要一次就可以完成整个操
作。

那么,在单纯地查找取值(而不是通过查找来插入新值)的时候,该怎
么处理找不到的键呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2331232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab轴承故障信号仿真与故障分析

1.摘要 本文介绍了一个基于Matlab的轴承故障信号仿真与分析程序,旨在模拟和分析轴承内圈故障信号的特征。程序首先通过生成故障信号、共振信号和调制信号,添加噪声和离散化处理,构建模拟的振动信号,并保存相关数据。通过快速傅里…

Linux 进程 | 概念 / 特征 / 状态 / 优先级 / 空间

注: 本文为 “Linux 进程” 相关文章合辑。 未整理去重。 Linux 进程概念(精讲) A little strawberry 于 2021-10-15 10:23:55 发布 基本概念 课本概念:程序的一个执行实例,正在执行的程序等。 内核观点&#xff…

重回全面发展亲自操刀

项目场景: 今年工作变动,优化后在一家做国有项目的私人公司安顿下来了。公司环境不如以前,但是好在瑞欣依然可以每天方便的买到。人文氛围挺好,就是工时感觉有点紧,可能长期从事产品迭代开发,一下子转变做项…

3D珠宝渲染用什么软件比较好?渲染100邀请码1a12

印度珠宝商 Mohar Fine Jewels 和英国宝石商 Gemfields 在今年推出了合作珠宝系列——「Emeralds in Full Bloom」,它的灵感源自花草绽放的春季田野,共有 39 件作品,下面这个以植物为主题的开口手镯就是其中一件。 在数字时代,像这…

【数据结构】邻接矩阵完全指南:原理、实现与稠密图优化技巧​

邻接矩阵 导读一、图的存储结构1.1 分类 二、邻接矩阵法2.1 邻接矩阵2.2 邻接矩阵存储网 三、邻接矩阵的存储结构四、算法评价4.1 时间复杂度4.2 空间复杂度 五、邻接矩阵的特点5.1 特点1解析5.2 特点2解析5.3 特点3解析5.4 特点4解析5.5 特点5解析5.6 特点6解析 结语 导读 大…

【嵌入式-stm32电位器控制以及旋转编码器控制LED亮暗】

嵌入式-stm32电位器控制LED亮暗 任务1代码1Key.cKey.hTimer.cTimer.hPWM.cPWM.hmain.c 实验现象1任务2代码2Key.cKey.hmain.c 实验现象2问题与解决总结 源码框架取自江协科技,在此基础上做扩展开发。 任务1 本文主要介绍利用stm32f103C8T6实现电位器控制PWM的占空比…

Uniapp 集成极光推送(JPush)完整指南

文章目录 前言一、准备工作1. 注册极光开发者账号2. 创建应用3. Uniapp项目准备 二、集成极光推送插件方法一:使用UniPush(推荐)方法二:手动集成极光推送SDK 三、配置原生平台参数四、核心功能实现1. 获取RegistrationID2. 设置别…

2025年常见渗透测试面试题-sql(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 SQLi 一、发现test.jsp?cid150 注入点的5种WebShell获取思路 1. 文件写入攻击 2. 日志文件劫持 3.…

【RabbitMQ】队列模型

1.概述 RabbitMQ作为消息队列,有6种队列模型,分别在不同的场景进行使用,分别是Hello World,Work queues,Publish/Subscribe,Routing,Topics,RPC。 下面就分别对几个模型进行讲述。…

StarRocks 助力首汽约车精细化运营

作者:任智红,首汽约车大数据负责人 更多交流,联系我们:https://wx.focussend.com/weComLink/mobileQrCodeLink/334%201%202/ffbe5 导读: 本文整理自首汽约车大数据负责人任智红在 StarRocks 年度峰会上的演讲&#xf…

痉挛性斜颈康复助力:饮食调养指南

痉挛性斜颈患者除了积极治疗,合理饮食也能辅助缓解症状,提升生活质量。其健康饮食可从以下方面着手: 高蛋白质食物助力肌肉修复 痉挛性斜颈会导致颈部肌肉异常收缩,消耗较多能量,蛋白质有助于肌肉的修复与维持。日常可…

mysql镜像创建docker容器,及其可能遇到的问题

前提,已经弄好基本的docker服务了。 一、基本流程 1、目录准备 我自己的资料喜欢放在 /data 目录下,所以老规矩: 先进入 /data 目录: cd /data 创建 mysql 目录并进入: mkdir mysql cd mysql 2、镜像查找 docke…

JavaEE——线程的状态

目录 前言1. NEW2. TERMINATED3. RUNNABLE4. 三种阻塞状态总结 前言 本篇文章来讲解线程的几种状态。在Java中,线程的状态是一个枚举类型,Thread.State。其中一共分为了六个状态。分别为:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING, TERMI…

RuntimeError: Error(s) in loading state_dict for ChartParser

一 bug错误 最近使用千问大模型有一个bug,报错信息如下 raise RuntimeError(Error(s) in loading state_dict for {}:\n\t{}.format( RuntimeError: Error(s) in loading state_dict for ChartParser:Unexpected key(s) in state_dict: "pretrained_model.em…

2025 年安徽交安安全员考试:利用记忆宫殿强化记忆​

安徽考生在面对交安安全员考试繁杂的知识点时,记忆宫殿是强大的记忆工具。选择一个熟悉且空间结构清晰的场所作为记忆宫殿,如自己居住的房屋。将房屋的不同区域,如客厅、卧室、厨房等,分别对应不同知识板块,像客厅对应…

安全编码课程 实验6 整数安全

实验项目 实现安全计数器:实现 Counter 结构,确保计数范围为 0~100。 实验要求: 1、使用 struct 封装计数值value; 2、计数器初值为 0; 3、increment() 方法增加计数,但不能超过 100; 4、decrem…

解决上传PDF、视频、音频等格式文件到FTP站点时报错“将文件复制到FTP服务器时发生错误。请检查是否有权限将文件放到该服务器上”问题

一、问题描述 可以将文本文件(.txt格式),图像文件(.jpg、.png等格式)上传到我们的FTP服务器上;但是上传一些PDF文件、视频等文件时就会报错“ 将文件复制到FTP服务器时发生错误。请检查是否有权限将文件放到该服务器上。 详细信息: 200 Type set to l. 227 Entering Pas…

【Linux操作系统】:信号

Linux操作系统下的信号 一、引言 首先我们可以简单理解一下信号的概念,信号,顾名思义,就是我们操作系统发送给进程的消息。举个简单的例子,我们在写C/C程序的时候,当执行a / 0类似的操作的时候,程序直接就挂…

经典频域分析法(Bode图、Nyquist判据) —— 理论、案例与交互式 GUI 实现

目录 经典频域分析法(Bode图、Nyquist判据) —— 理论、案例与交互式 GUI 实现一、引言二、经典频域分析方法的基本原理2.1 Bode 图分析2.2 Nyquist 判据三、数学建模与公式推导3.1 一阶系统的频域响应3.2 多极系统的 Bode 图绘制3.3 Nyquist 判据的数学描述四、经典频域分析…

使用scoop一键下载jdk和实现版本切换

安装 在 PowerShell 中输入下面内容,保证允许本地脚本的执行: set-executionpolicy remotesigned -scope currentuser然后执行下面的命令安装 Scoop: iwr -useb get.scoop.sh | iex国内用户可以使用镜像源安装:powershell iwr -us…