bidict:Python 中高效的双向字典库

news2024/9/29 7:45:56

在这里插入图片描述

在 Python 编程中,字典(dict)是用于存储键值对的强大数据结构,能够快速地根据键查找值。然而,有时我们不仅需要从键查找值,还需要根据值查找键。这种双向查询需求在很多场景中很常见,如映射表、缓存系统、反向索引等。如果我们依赖原生字典实现双向映射,可能需要维护两个字典,代码复杂度也随之增加。

bidict 库正是为了解决这一问题而设计的,它是一个高效且安全的双向字典实现,能够同时支持键到值以及值到键的双向映射。在不损失性能的前提下,bidict 提供了简洁的 API,使得开发者可以方便地在各种应用场景中使用双向字典。

本文将介绍 bidict 的主要功能、应用场景,并通过代码示例演示如何在 Python 项目中使用 bidict 实现高效的双向映射。

在这里插入图片描述
华丽的分割线

⭕️宇宙起点

    • 💯 bidict 的特点
    • 💯 安装 bidict
    • 💯 bidict 的基本用法
      • 1. 创建双向字典
      • 2. 插入和更新键值对
      • 3. 自动去重与冲突检测
      • 4. 反向字典(.inv 属性)
    • 💯 高级功能
      • 1. 强制更新模式
      • 2. 冻结字典:不可变的双向字典
      • 3. 扩展 bidict:Bidirectional Mapping
    • 💯 bidict 的应用场景
      • 1. 缓存系统
      • 2. 编码与解码
      • 3. 数据索引与查找
      • 4. 构建反向映射关系
    • 📥 下载地址
    • 💬 结语
    • 📒 参考文献


标题1

💯 bidict 的特点

bidict 库相比 Python 的原生字典有如下几个显著特点:

  1. 双向映射:bidict 支持同时根据键查值和根据值查键,简化了双向映射场景下的代码编写。
  2. 自动去重:bidict 确保字典中的键和值都是唯一的,防止重复的键或值导致数据混乱。
  3. 高效性:与维护两个原生字典相比,bidict 在内存和性能上都更加高效。
  4. 错误处理:bidict 提供了丰富的错误处理机制,确保在插入冲突时抛出合理的异常。

标题2

💯 安装 bidict

要使用 bidict,首先需要通过 pip 安装:

pip install bidict

安装完成后,就可以在 Python 项目中使用 bidict 来实现双向字典功能。


标题3

💯 bidict 的基本用法

bidict 的 API 非常类似于 Python 的原生字典,因此对于熟悉 Python 字典的开发者来说,上手 bidict 非常简单。下面是一些基本的用法示例。

1. 创建双向字典

创建一个双向字典与创建普通字典的方式类似。你可以传入键值对来初始化 bidict。

from bidict import bidict

# 创建一个双向字典
b = bidict({'a': 1, 'b': 2, 'c': 3})

print(b['a'])  # 输出: 1
print(b.inv[1])  # 通过值查找键,输出: 'a'

在这个示例中,我们创建了一个字典 b,可以通过 b['a'] 查找键对应的值,也可以通过 b.inv[1] 反向查找值对应的键。inv 属性是 bidict 提供的用于反向查找的接口。

2. 插入和更新键值对

像普通字典一样,bidict 允许你添加或更新键值对。

b = bidict()

# 插入键值对
b['x'] = 10
b['y'] = 20

# 更新键值对
b['x'] = 30

# 反向查询
print(b.inv[30])  # 输出: 'x'

在这个示例中,我们首先插入了一对键值 x: 10,然后更新了键 x 对应的值为 30,并通过反向查询得到了 x

3. 自动去重与冲突检测

bidict 确保了字典中的键和值都是唯一的。如果你尝试插入一个重复的键或值,bidict 会抛出 ValueError 异常。

from bidict import bidict, ValueDuplicationError

b = bidict({'a': 1, 'b': 2})

# 尝试插入重复的值
try:
    b['c'] = 1  # 1 已经作为 'a' 的值存在
except ValueDuplicationError as e:
    print(f"错误: {e}")

在这个示例中,尝试插入重复的值 1 会抛出 ValueDuplicationError,因为 1 已经作为 a 的值存在。

4. 反向字典(.inv 属性)

bidict 的 inv 属性用于创建一个反向字典,允许根据值查找键。这种反向映射的功能在数据结构、索引系统等场景中非常有用。

b = bidict({'apple': 'red', 'banana': 'yellow'})

# 通过键查找值
print(b['apple'])  # 输出: red

# 通过值查找键
print(b.inv['red'])  # 输出: apple

b.inv 提供了一个反向映射视图,使得你可以轻松进行双向查找。


标题4

💯 高级功能

1. 强制更新模式

在某些情况下,你可能希望允许键值对的冲突,并且强制更新字典中的值。bidict 支持通过 on_dup 参数来控制冲突处理行为。你可以使用 on_dup='overwrite' 强制覆盖冲突的键或值。

from bidict import bidict

# 使用强制覆盖模式
b = bidict({'a': 1, 'b': 2})

# 强制覆盖值
b.put('c', 1, on_dup='overwrite')

print(b)  # 输出: bidict({'b': 2, 'c': 1})

在这个示例中,put 方法强制覆盖了键 c,并且值 1 也被覆盖到新的键 c

2. 冻结字典:不可变的双向字典

bidict 提供了 FrozenBidict 类型,这是一种不可变的双向字典,类似于 Python 中的 frozenset,适用于需要只读访问的数据场景。

from bidict import FrozenBidict

frozen_b = FrozenBidict({'a': 1, 'b': 2})

# 尝试修改会抛出异常
try:
    frozen_b['c'] = 3
except TypeError as e:
    print(f"错误: {e}")

FrozenBidict 可以确保字典中的数据不会被修改,适用于那些需要数据完整性保障的场景。

3. 扩展 bidict:Bidirectional Mapping

bidict 也可以作为其他高级数据结构的基础,比如用于构建双向缓存、双向映射关系等。通过结合 LRU Cache 或其他数据结构,bidict 可以应用于更多复杂的场景。


标题5

💯 bidict 的应用场景

bidict 提供的双向映射特性在许多场景中非常有用,以下是一些典型的应用场景:

1. 缓存系统

在缓存系统中,我们常常需要根据键查找缓存的值,也需要反向根据缓存的值查找到对应的键。使用 bidict,可以高效地实现这样的双向映射。

2. 编码与解码

在编码与解码过程中,开发者通常需要维护一对一的映射关系,例如字符编码表、哈希函数映射等。bidict 能够轻松实现编码和解码的双向查询,简化代码逻辑。

3. 数据索引与查找

在某些数据库或搜索引擎中,我们需要快速从键查找值(正向索引)或从值查找键(反向索引)。bidict 作为一种轻量级的数据结构,适合构建内存中的索引系统。

4. 构建反向映射关系

在图论或网络模型中,节点之间的双向映射关系非常常见。使用 bidict 可以方便地构建这些双向的节点关系,并且在复杂的图结构中高效处理数据。


标题6

📥 下载地址


bidict 最新版 下载地址


标题7

💬 结语

bidict 是一个专门为双向映射设计的高效 Python 库,它简化了在开发中需要同时维护键值对正反查找的场景。通过类似原生字典的 API 和反向字典支持,bidict 提供了简洁、强大的双向映射解决方案。无论是在缓存、编码、索引等复杂数据结构中,还是在处理普通的键值映射中,bidict 都是一个值得推荐的工具。


标题8

📒 参考文献

  • bidict 官方文档
  • bidict GitHub仓库

TheEnd


在这里插入图片描述
在这里插入图片描述

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

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

相关文章

openEuler 修改网卡和常用网络配置

简介 1、网卡启用、禁用和查看状态 2、编辑网卡,配置静态Ip 3、删除之前网卡缓存的Ip 4、机器即连接内网,又连接外网 的网卡配置 5、openEuler 修改默认的镜像仓库(推荐)1、网卡启用、禁用和查看状态 # 查看网络状态 nmcli devi…

muduo网络库介绍

文章目录 MuduoServer常见接口TcpServer类EventLoop类TcpConnection类 服务器搭建Client常见接口TcpClient类 客户端搭建 Muduo Muduo是陈硕大佬开发的,一个基于非阻塞IO和事件驱动的C高并发网络编程库 这是一个基于主从Reactor模型的网络编程库,线程模型是one loop per thre…

K-means聚类分析对比

K-means聚类分析,不同K值聚类对比,该内容是关于K-means聚类分析的,主要探讨了不同K值对聚类结果的影响。K-means聚类是一种常见的数据分析方法,用于将数据集划分为K个不同的类别。在这个过程中,选择合适的K值是非常关键…

VSCode 中配置 C/C++ 环境的步骤

VSCode 中配置 C/C 环境的步骤 1. 安装 VSCode 1、下载位置 https://code.visualstudio.com/Download2、安装 正常操作步骤,同意协议,下一步,点击完成即可 2. 安装 C/C 扩展 打开 VSCode。 点击左侧的扩展图标(或使用快捷键…

Linux网络:网络编程套接字

socket 套接字 socket常见API 创建套接字:(TCP/UDP,客户端服务器) int socket(int domain, int type, int protocol);绑定端口号:(TCP/UDP,服务器) int listen(int sockfd, int …

Python 算法交易实验89 QTV200日常推进-模式思考

说明 过去几天大A的表现还是比较戏剧化的。 让我想到了: 1 价稳量缩模式。之前很长一段时间都是这种状态,最终还是大爆发了,这个可取。2 周期模式。假设价格是一个周期为T(T可变)的正弦波,所以最终还是回到了几个月前的位置&…

Java 常用运算符简单总结

目录 1. 运算符​编辑 1.1 算术运算符​编辑 1.1.1 除法运算符​编辑 1.1.2 取模(取余)运算符​编辑 1.1.3 自增/减运算符​编辑​编辑 1.2 关系运算符 1.3 逻辑运算符 1.3.1 逻辑/短路与 1.3.2 逻辑/短路或 1.4 取反操作 1.5 逻辑异或 1.4 …

第三节-类与对象(中)

1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类(空类大小为1)。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:…

828华为云征文|华为云弹性云服务器FlexusX实例下的Nginx性能测试

本文写的是华为云弹性云服务器FlexusX实例下的Nginx性能测试 目录 一、华为云弹性云服务器FlexusX实例简介二、测试环境三、测试工具四、测试方法五、测试结果 下面是华为云弹性云服务器FlexusX实例下的Nginx性能测试。 一、华为云弹性云服务器FlexusX实例简介 华为云弹性云服…

Woocommerce怎么分类显示产品?如何将Shopify的产品导入到Woocommerce?

WooCommerce作为WordPress的一个电子商务插件,功能强大、使用简洁,能够轻松集成到WordPress网站中,为用户提供了一个完整的在线商店解决方案,在国外还是挺受欢迎的。 Woocommerce怎么分类显示产品? 在Woocommerce中&a…

数据资产新范式,URP城市焕新平台东博会首发!

城市数据资产蕴藏着巨大的宝藏。今年1月,国家数据局印发《“数据要素”三年行动计划(2024—2026年)》,将“数据要素智慧城市”上升为“数据要素”计划的重要部分,加速释放城市数据资产价值。 高质量发展以数据要素驱动…

聚星文社最新风格图库角色

聚星文社最新风格图库角色涵盖了各种不同的风格和类型。以下是一些可能的角色风格: Docs聚星文社https://iimenvrieak.feishu.cn/docx/ZhRNdEWT6oGdCwxdhOPcdds7nof 现代都市风格角色:这种角色通常穿着时尚的衣服,有时尚的发型和化妆。他们可…

【Python】Jet Bridge:快速构建内部工具和管理面板的高效解决方案

Jet Bridge 是一个开源的后台管理工具构建框架,专门用于帮助开发者快速创建内部工具、管理面板和仪表板。它允许用户通过现有的数据库结构快速生成强大的 CRUD(创建、读取、更新、删除)接口,并提供了直观的可视化界面。Jet Bridge…

反思式思维链大模型 o1 有啥用?

(注:本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费) 失望 OpenAI o1 刚出来的时候,我其实对这种 reflection 模型有点儿免疫了。因为刚刚被 reflection 70B 模型诳过一回。 第一时间&#xff0c…

漏洞挖掘 | 某系统中少见的前端登录校验

0 前言 我也是第一次碰到前端登录校验的站点,那所谓前端校验,就是不走后端,这种情况大概率会在前端存着登录的账号和密码,除此之外,一些验证码也可能会在前端校验。 1 测试 如下图,点普通的功能点均显示…

Deep Learning for Video Anomaly Detection: A Review 深度学习视频异常检测综述阅读

Deep Learning for Video Anomaly Detection: A Review 深度学习视频异常检测综述阅读 AbstractI. INTRODUCTIONII. BACKGROUNDA. Notation and TaxonomyB. Datasets and Metrics III. SEMI-SUPERVISED VIDEO ANOMALY DETECTIONA. Model InputB. MethodologyC. Network Archite…

栏目一:使用echarts绘制简单图形

栏目一:使用echarts绘制简单图形 前言1. 在线编辑图形1.1 折线图1.2 柱状图1.3 扇形图 2. 本地绘制图表2.1 下载echarts.min.js2.2 创建一个简单的图形 前言 Echarts是一款基于JavaScript的可视化图表库。它提供了丰富的图表类型和交互功能,可以用于在网…

Golang | Leetcode Golang题解之第445题两数相加II

题目: 题解: func reverseList(head *ListNode) *ListNode {if head nil || head.Next nil {return head}newHead : reverseList(head.Next)head.Next.Next head // 把下一个节点指向自己head.Next nil // 断开指向下一个节点的连接,保证…

Study-Oracle-10-ORALCE19C-RAC集群搭建(一)

一、硬件信息及配套软件 1、硬件设置 RAC集群虚拟机:CPU:2C、内存:10G、操作系统:50G Openfile数据存储:200G (10G*2) 2、网络设置 主机名公有地址私有地址VIP共享存储(SAN)rac1192.168.49.13110.10.10.20192.168.49.141192.168.49.130rac2192.168.49.13210.10.10.3…

使用dockerfile来构建一个包含Jdk17的centos7镜像(构建镜像:centos7-jdk17)

文章目录 1、dockerfile简介2、入门案例2.1、创建目录 /opt/dockerfilejdk172.2、上传 jdk-17_linux-x64_bin.tar.gz 到 /opt/dockerfilejdk172.3、在/opt/dockerfilejdk17目录下创建dockerfile文件2.4、执行命令构建镜像 centos7-jdk17 : 不要忘了后面的那个 .2.5、查看镜像是…