Python 字典和集合(子类化UserDict)

news2025/4/18 5:55:25

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

子类化UserDict

就创造自定义映射类型来说,以 UserDict 为基类,总比以普通的
dict 为基类要来得方便。

这体现在,我们能够改进示例 3-7 中定义的 StrKeyDict0 类,使得所
有的键都存储为字符串类型。

而更倾向于从 UserDict 而不是从 dict 继承的主要原因是,后者有时
会在某些方法的实现上走一些捷径,导致我们不得不在它的子类中重写
这些方法,但是 UserDict 就不会带来这些问题。

另外一个值得注意的地方是,UserDict 并不是 dict 的子类,但是
UserDict 有一个叫作 data 的属性,是 dict 的实例,这个属性实际上
是 UserDict 最终存储数据的地方。这样做的好处是,比起示例 3-
7,UserDict 的子类就能在实现__setitem__ 的时候避免不必要的递
归,也可以让__contains__ 里的代码更简洁。

多亏了 UserDict,示例 3-8 里的 StrKeyDict 的代码比示例 3-7 里的
StrKeyDict0 要短一些,功能却更完善:它不但把所有的键都以字符
串的形式存储,还能处理一些创建或者更新实例时包含非字符串类型的
键这类意外情况。

示例 3-8 无论是添加、更新还是查询操作,StrKeyDict 都会把
非字符串的键转换为字符串

import collections
class StrKeyDict(collections.UserDict): ➊
  def __missing__(self, key): ➋
    if isinstance(key, str):
      raise KeyError(key)
    return self[str(key)]
    def __contains__(self, key):
      return str(key) in self.data ➌
    def __setitem__(self, key, item):
      self.data[str(key)] = item ➍

❶ StrKeyDict 是对 UserDict 的扩展。
missing 跟示例 3-7 里的一模一样。
contains 则更简洁些。这里可以放心假设所有已经存储的键都
是字符串。因此,只要在 self.data 上查询就好了,并不需要像
StrKeyDict0 那样去麻烦 self.keys()。
setitem 会把所有的键都转换成字符串。由于把具体的实现委
托给了 self.data 属性,这个方法写起来也不难。
因为 UserDict 继承的是 MutableMapping,所以 StrKeyDict 里剩下
的那些映射类型的方法都是从 UserDict、MutableMapping 和
Mapping 这些超类继承而来的。特别是最后的 Mapping 类,它虽然是
一个抽象基类(ABC),但它却提供了好几个实用的方法。以下两个方
法值得关注。

MutableMapping.update
这个方法不但可以为我们所直接利用,它还用在__init__ 里,让
构造方法可以利用传入的各种参数(其他映射类型、元素是 (key,
value) 对的可迭代对象和键值参数)来新建实例。因为这个方法在背
后是用 self[key] = value 来添加新值的,所以它其实是在使用我们
的__setitem__ 方法。

Mapping.get
 在 StrKeyDict0(示例 3-7)中,我们不得不改写 get 方法,好让
它的表现跟 getitem 一致。而在示例 3-8 中就没这个必要了,因
为它继承了 Mapping.get 方法,而 Python 的源码
(https://hg.python.org/cpython/file/3.4/Lib/_collections_abc.py#l422)显示,这个方法的实现方式跟 StrKeyDict0.get 是一模一样的。

在写完 StrKeyDict 这个类之后,我读到了 Antonie Pitrou 写
的“PEP 455 — Adding a key-transforming dictionary to
collections”(https://www.python.org/dev/peps/pep-0455/)。文章附
带的补丁里包含了一个叫作 TransformDict 的新类型。这个补丁
通过 issue 18986(http://bugs.python.org/issue18986)被吸收进了
Python 3.5。为了试试这个类,我把它提取出来放进了一个单独的模
块(在本书代码仓库中:03-dictset/
transformdict.py,https://github.com/fluentpython/examplecode/
blob/master/03-dict-set/transformdict.py)。比起
StrKeyDict,TransformDict 的通用性更强,也更复杂,因为它
把键存成字符串的同时,还要按照它原来的样子存一份。

之前我们见识过了不可变的序列类型,那有没有不可变的字典类型呢?
这么说吧,在标准库里是没有这样的类型的,但是可以用替身来代替。

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

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

相关文章

哈希表(开散列)的实现

目录 引入 开散列的底层实现 哈希表的定义 哈希表的扩容 哈希表的插入 哈希表查找 哈希表的删除 引入 接上一篇,我们使用了闭散列的方法解决了哈希冲突,此篇文章将会使用开散列的方式解决哈希冲突,后面对unordered_set和unordered_map的…

[蓝桥杯] 挖矿(CC++双语版)

题目链接 P10904 [蓝桥杯 2024 省 C] 挖矿 - 洛谷 题目理解 我们可以将这道题中矿洞的位置理解成为一个坐标轴,以题目样例绘出坐标轴: 样例: 输入的5为矿洞数量,4为可走的步数。第二行输入是5个矿洞的坐标。输出结果为在要求步数…

远程监控系统项目里练习

1、项目目标 设备端: (1)基于stm32mp157开发板,裁剪linux5.10.10,完成ov5640摄像头移植; (2)完成用户层程序,完成对摄像头的控制及与云端服务的数据交互。 云端&…

安装并配置Maven

如图所示&#xff0c;解压安装包&#xff0c;配置环境变量&#xff0c;在bin目录那个界面新建文件夹repository&#xff0c;写上安装路径的坐标&#xff0c;修改Maven仓库镜像&#xff0c;输入cmd验证是否安装成功 <mirror><id>alimaven</id><mirrorOf>…

PlatformIO 自定义脚本选择编译库源文件 - 设置只用于C++ 的编译选项

PlatformIO 只支持以文件夹为单位选择要编译的源文件&#xff0c;不像Keil 或者CMake&#xff0c;可以手动控制每一个源文件。而且默认只会将库的src 文件夹下的源文件全部加入编译。比如&#xff0c;某个库的文件结构如下&#xff1a; libx src include mem| a.c| b.c| c.c…

dolphinscheduler单机部署链接oracle

部署成功请给小编一个赞或者收藏激励小编 1、安装准备 JDK版本:1.8或者1.8oracle版本&#xff1a;19Coracle驱动版本&#xff1a;8 2、安装jdk 下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8 下载后上传到/tmp目录下。 然后执行下面命…

MongoDB常见面试题总结(上)

MongoDB 基础 MongoDB 是什么&#xff1f; MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统&#xff0c;由 C 编写的。MongoDB 提供了 面向文档 的存储方式&#xff0c;操作起来比较简单和容易&#xff0c;支持“无模式”的数据建模&#xff0c;可以存储比较复杂…

MATLAB2024a超详细图文安装教程(2025最新版保姆级教程)附安装钥

目录 前言 一、MATLAB下载 二、MATLAB安装 二、MATLAB启动 前言 MATLAB&#xff08;Matrix Laboratory&#xff09;是由MathWorks公司开发的一款高性能的编程语言和交互式环境&#xff0c;主要用于数值计算、数据分析和算法开发。内置数学函数和工具箱丰富&#xff0c;开发…

基于 Spring Boot 瑞吉外卖系统开发(二)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;二&#xff09; 员工登录功能实现 员工登录页面login.html存放在/resources/backend/page/login目录下。 启动项目&#xff0c;在浏览器中通过地址“http://localhost:8080/backend/page/login/login.html”访问员工登录页面。…

软考系统架构设计师之大数据与人工智能笔记

一、大数据架构设计 1. 核心概念与挑战 大数据特征&#xff1a;体量大&#xff08;Volume&#xff09;、多样性&#xff08;Variety&#xff09;、高速性&#xff08;Velocity&#xff09;、价值密度低&#xff08;Value&#xff09;。传统数据库问题&#xff1a;数据过载、性…

146. LRU 缓存 带TTL的LRU缓存实现(拓展)

LRU缓存 方法一:手动实现双向链表 哈希表 struct Node{int val;int key;Node* prev;Node* next;Node(int a, int b): key(a), val(b), prev(nullptr), next(nullptr) {}Node():key(0), val(0), prev(nullptr), next(nullptr) {} }; class LRUCache { private:Node* removeTai…

浅层神经网络:全面解析(扩展)

浅层神经网络&#xff1a;全面解析&#xff08;扩展&#xff09; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 一、神经网络架构演进图谱 #mermaid-svg-…

Qt 事件系统负载测试:深入理解 Qt 事件处理机制

Qt 事件系统负载测试&#xff1a;深入理解 Qt 事件处理机制 文章目录 Qt 事件系统负载测试&#xff1a;深入理解 Qt 事件处理机制摘要引言实现原理1. 自定义事件类型2. 事件队列管理3. 性能指标监控4. 事件发送机制 性能监控实现1. 负载计算2. 内存监控3. 延迟计算 使用效果优化…

Unity3D仿星露谷物语开发33之光标位置可视化

1、目标 当从道具栏中拖出一个道具到地面的时候&#xff0c;光标区域会显示是否可放置物体的可视化显示。绿色表示可以放置物体&#xff0c;红色表示不可以放置物体。 2、优化InventoryManager脚本 添加2个方法&#xff1a; /// <summary>/// Returns the itemDetails&…

蓝桥杯冲刺题单--二分

二分 知识点 二分&#xff1a; 1.序列二分&#xff1a;在序列中查找&#xff08;不怎么考&#xff0c;会比较难&#xff1f;&#xff09; 序列二分应用的序列必须是递增或递减&#xff0c;但可以非严格 只要r是mid-1&#xff0c;就对应mid&#xff08;lr1&#xff09;/2 2.答…

MySQL原理(一)

目录 一、理解MySQL的服务器与客户端关系 1&#xff1a;MySQL服务器与客户端 2&#xff1a;服务器处理客户端请求 3&#xff1a;常见的存储引擎 二、字符集和比较规则 1&#xff1a;字符集和比较规则简介 2&#xff1a;字符集和比较规则应用 3&#xff1a;乱码原因&…

Docker+Jenkins+Gitee自动化项目部署

前置条件 docker安装成功 按照下面配置加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://register.librax.org"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker一、…

VScode 画时序图(FPGA)

1、先安装插件&#xff1a; 2、然后就可以编写一个.js文件&#xff0c;如下&#xff1a; {signal: [{name: clk, wave: p.......|..},{name: rstn, wave: 01......|..},{name: din_vld, wave: 0.1.0...|..},{name: din, wave: "x.x...|..", data: ["D0", …

一文详解OpenCV环境搭建:Windows使用CLion配置OpenCV开发环境

在计算机视觉和图像处理领域&#xff0c;OpenCV 是一个不可或缺的工具。其为开发者提供了一系列广泛的算法和实用工具&#xff0c;支持多种编程语言&#xff0c;并且可以在多个平台上运行。对于希望在其项目中集成先进视觉功能的开发者来说&#xff0c;掌握如何配置和使用OpenC…

计算机网络 3-2 数据链路层(流量控制与可靠传输机制)

3.4 流量控制与可靠传输机制 流量控制&#xff1a;指由接收方控制发送方的发送速率&#xff0c;使接收方有足够的缓冲空间来接收每个帧 滑动窗口流量控制:一种更高效的流量控制方法。 在任意时刻&#xff0c;发送方都维持一组连续的允许发送帧的序号&#xff0c;称为发送窗口…