0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Bi-Dictionary库-双向字典介绍

Linux爱好者 来源:Linux爱好者 作者:Linux爱好者 2022-08-22 09:26 次阅读

【导语】:本文介绍了Bi-Dictionary 库,即“Bi-directional Dictionary”双向字典,顾名思义,该库基于Python中的字典增加了由“值”访问键的功能,开发者可以通过值来反向查找键,使得处理字典更加方便。同时,该库也引起了 Python 之父 Guido 的注意,因此,很有必须学习Bi-Dictionary 库。

简介

字典是Python中最常见的数据结构之一,在日常开发中使用的频率很高。字典由一些键值对构成,我们只能通过键访问值,但是无法通过值访问键。目前有一个第三方库很好的解决了这个问题 - Bi-Dictionary,通过使用它,我们可以由值访问键。该库甚至引起了 Python 之父 Guido 的注意,因此这一特性未来可能会被加入到Python语法中。

安装

我们可以使用pip安装bidict库:

pipinstallbidict

随后,需要导入该库才能使用:

frombidictimportbidict

简单使用

初步使用

我们首先通过创建一个字典,该字典的键为国家的简称,值为国家的全名,再用bidict初始化这个字典:

country_abbr_bidict = bidict({'USA': 'The United States of America'})

这样,我们只需要使用inverse()方法,就可以通过国家全称获取国家简称了:

frombidictimportbidict
country_abbr_bidict=bidict({'USA':'TheUnitedStatesofAmerica'})
shortName=country_abbr_bidict.inverse['TheUnitedStatesofAmerica']
print(shortName)

结果为:USA

我们可以对比下原字典和反转后的区别:

frombidictimportbidict
country_abbr_bidict=bidict({'USA':'TheUnitedStatesofAmerica'})
print(country_abbr_bidict)
print(country_abbr_bidict.inverse)

结果显示,inverse()方法反转了原字典的键值位置:

bidict({'USA':'TheUnitedStatesofAmerica'})
bidict({'TheUnitedStatesofAmerica':'USA'})

为何不使用Python的字典呢?

我们也可以在字典中把键值互换,再存储一份数据,这样也能实现与bidict相同的效果。我们来尝试一下:

country_abbr_dict={
'USA':'TheUnitedStatesofAmerica',
'TheUnitedStatesofAmerica':'USA'
}

如果我们想把USA更新成US,可以使用update()方法,像下面这样:

country_abbr_dict.update({
'US':'TheUnitedStatesofAmerica',
'TheUnitedStatesofAmerica':'US'
})

这似乎看起来很完美,但是字典仍然保留了原来的数据:

frombidictimportbidict
country_abbr_dict={
'USA':'TheUnitedStatesofAmerica',
'TheUnitedStatesofAmerica':'USA'
}
country_abbr_dict.update({
'US':'TheUnitedStatesofAmerica',
'TheUnitedStatesofAmerica':'US'
})
print(country_abbr_dict)

在结果中我们可以看到USA也在字典中:

{'USA': 'The United States of America', 'The United States of America': 'US', 'US': 'The United States of America'}

为了避免这个问题,只能定义一个函数:

defupdate(d,key,val):
oldval=d.pop(key,object())
d.pop(oldval,None)
oldkey=d.pop(val,object())
d.pop(oldkey,None)
d.update({key:val,val:key})

country_abbr_dict={
'USA':'TheUnitedStatesofAmerica',
'TheUnitedStatesofAmerica':'USA'
}
update(country_abbr_dict,'US','TheUnitedStatesofAmerica')
print(country_abbr_dict)

这样就可以成功更新字典了:

{'US': 'The United States of America', 'The United States of America': 'US'}

如果使用Bidict,就非常简单了:

country_abbr_bidict.inverse['TheUnitedStatesofAmerica']='US'
print(country_abbr_bidict)

bidict({'US': 'The United States of America'})

Bidict用起来,明显更方便!

Bidict的其他用途

在查找值之前,传入默认值

Bidict继承了Python字典中的大部分特性。例如,当我们想要通过键访问bidict中的某个值时,可以传入一个默认值。这样,如果bidict中没有该值,就会将默认值作为结果返回。

frombidictimportbidict
country_abbr_bidict=bidict({
'US':'TheUnitedStatesofAmerica',
})
print(country_abbr_bidict.get('AU','Australia'))

结果就是我们传入的默认值:Australia

加入新的键值对

Bidict加入新键值对的方式与Python的原生字典一样,我们来试试:

frombidictimportbidict
country_abbr_bidict=bidict({
'US':'TheUnitedStatesofAmerica',
})
country_abbr_bidict['AU']='Australia'
country_abbr_bidict['CA']='Canada'
print(country_abbr_bidict)

结果为:

bidict({'US': 'The United States of America', 'AU': 'Australia', 'CA': 'Canada'})

检验Bidict中是否有某个特定值

(1)我们可以使用in关键字来检查Bidict中是否有CA:

'CA' in country_abbr_bidict

我们可以得到一个布尔值,表示该键是否存在于Bidict中:True

(2)同样我们也可以检查Bidict中是否有某个值,

'Australia' in country_abbr_bidict.inverse

结果显示Bidict中有该值:True

Pop and Delete方法

除了上述特性外,我们还可以使用Pop and Delete方法。

(1)pop()方法可以从Bidict中弹出键值对

country_abbr_bidict.pop('AU')

会返回该键对应的值:Australia

我们再看看Bidict:country_abbr_bidict

发现里面没有AU这个键值对了:bidict({'US': 'The United States of America', 'CA': 'Canada'})

(2)delete()方法可以通过键或者值的方式删除键值对

delcountry_abbr_bidict.inverse['Canada']
print(country_abbr_bidict)

结果显示删除成功:bidict({'US': 'The United States of America'})

约束

Python的设计理念是当程序出现错误时,一定要显示出来,Bidict的设计也遵循了这一点。Bidict的一个约束是键、值都要唯一,这是因为值也有可能会被当作键使用。因此,当我们想在Bidict中加入一个新的键值对(该键值对的值已经被其他键使用),就会报错。例如,我们想把US - The United States of America加入Bidict中,但是原字典中已有USA - The United States of America了:

frombidictimportbidict
country_abbr_bidict=bidict({
'USA':'TheUnitedStatesofAmerica',
})
country_abbr_bidict['US']='TheUnitedStatesofAmerica'

会产生如下错误:

Traceback(mostrecentcalllast):
File"F:/Documents/其他资料/pythonprojects/01practice/app.py",line5,in
country_abbr_bidict['US']='TheUnitedStatesofAmerica'
File"F:pythonlibsite-packagesidict\_bidict.py",line67,in__setitem__
self.put(key,val,on_dup=self.on_dup)
File"F:pythonlibsite-packagesidict\_bidict.py",line93,input
self._update([(key,val)],on_dup=on_dup)
File"F:pythonlibsite-packagesidict\_base.py",line455,in_update
dedup_result=self._dedup(key,val,on_dup)
File"F:pythonlibsite-packagesidict\_base.py",line350,in_dedup
raiseValueDuplicationError(val)
bidict.ValueDuplicationError:TheUnitedStatesofAmerica

我们可以使用forceput()方法来避免这一错误:country_abbr_bidict.forceput('USA', 'The United States of America')

但是,如果出现了两个键的值相同这种情况,该方法会把原来的键覆盖:bidict({'US': 'The United States of America'})

其他特性

更新多个键值对

putall()方法可以同时加入多个键值对到Bidict中,但传入的参数必须是可迭代的。

country_abbr_bidict.putall([
('AU','Australia'),
('CA','Canada')
])
print(country_abbr_bidict)

结果显示加入成功:bidict({'USA': 'The United States of America', 'AU': 'Australia', 'CA': 'Canada'})

当某个键值对无法传入时,那么其他键值对也无法传入:

country_abbr_bidict=bidict({'US':'UnitedStatesofAmerica'})
country_abbr_bidict.putall([
('AU','Australia'),
('CA','Canada'),
('US','TheUnitedStatesofAmerica')
])

这里出现了报错:

Traceback(mostrecentcalllast):
File"F:/Documents/其他资料/pythonprojects/01practice/app.py",line3,in
country_abbr_bidict.putall([
File"F:pythonlibsite-packagesidict\_bidict.py",line179,inputall
self._update(items,on_dup=on_dup)
File"F:pythonlibsite-packagesidict\_base.py",line443,in_update
target._update(arg,kw,rbof=False,on_dup=on_dup)
File"F:pythonlibsite-packagesidict\_base.py",line455,in_update
dedup_result=self._dedup(key,val,on_dup)
File"F:pythonlibsite-packagesidict\_base.py",line343,in_dedup
raiseKeyDuplicationError(key)
bidict.KeyDuplicationError:US

而其他键值对也没有传入到Bidict中:bidict({'US': 'United States of America'})

forceupdate()方法的优先级

如果我们想使用该方法传入多个键值对,对Bidict进行更新,那么就要注意传入数据的先后顺序了。

如果把USA放到最后,那么最终Bidict就会使用该键:

country_abbr_bidict=bidict({'US':'UnitedStatesofAmerica'})
country_abbr_bidict.forceupdate([
('US','TheUnitedStatesofAmerica'),
('USA','TheUnitedStatesofAmerica')
])

结果为:bidict({'USA': 'The United States of America'})

如果把US放到最后,那么字典就会将US作为键。

country_abbr_bidict.forceupdate([
('USA','TheUnitedStatesofAmerica'),
('US','TheUnitedStatesofAmerica')
])
print(country_abbr_bidict)

结果为:bidict({'US': 'The United States of America'})

与其他数据结构交互

Bidict可以转换为其他数据结构,反之亦然。例如,我们可以把Bidict转换为字典:dict(country_abbr_bidict)

结果为:{'US': 'United States of America'}

我们再把字典转换为Bidict: bidict(dict(country_abbr_bidict))

结果为:bidict({'US': 'United States of America'})

结论

在本文中,我介绍了Bi-Dictionary库-双向字典,也称为Bidict。它不仅改进了Python字典的缺点,而且遵循了Python的设计原则。非常值得学习!

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3866

    浏览量

    61308
  • 数据结构
    +关注

    关注

    3

    文章

    564

    浏览量

    39899
  • python
    +关注

    关注

    51

    文章

    4675

    浏览量

    83465

原文标题:这个字典库引起了 Python 之父的注意!你用过吗?

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何手动编辑MPLAB的拼写检查字典

    如何手动编辑MPLAB的拼写检查字典,例如Eclipse的用户字典?我试图手动纠正MPLAB拒绝接受的拼写值,而它却用“环绕/ /”来声明(见附件)。谢斯,思想? 以上来自于百度翻译 以下为原文
    发表于 11-07 15:09

    OpenBravo数据结构基本分析

    一.表前缀的意义A_:基本资料管理(asset management)AD_:基础字典(application dictionary)C_:核心功能I_:导入数据的临时表和过程M_:物料管理
    发表于 07-11 06:50

    SCL使用Ref和Variant实现Dictionary 相关资料分享

    在C#中,Dictionary的主要用途是提供快速的基于键-值对的数据存储和查找。Dictionary的结构是这样的:Dictionary。其中key一般为基础数据类型(当然也可以是复杂
    发表于 07-02 07:16

    Dictionary的功能块接口有哪些?其作用是什么?

    Dictionary的主要用途是什么?Dictionary的结构是由哪些部分组成的?Dictionary的功能块接口有哪些?其作用是什么?
    发表于 07-02 07:31

    Addict 一个写起来令人极其舒适的字典模块

    Addit 是一个Python模块,除了提供标准的字典语法外,Addit 生成的字典的值既可以使用属性来获取,也可以使用属性进行设置。这意味着你不用再写这样的字典了:body = { 'query
    发表于 06-21 16:13

    The Illustrated Dictionary of

    The Illustrated Dictionary of Electronics Acknowledgments Illustrations in this book were
    发表于 09-09 09:35 3次下载
    The Illustrated <b class='flag-5'>Dictionary</b> of

    一种基于块对角化表示的多视角字典对学习方法

    ,且仅考虑一种合成型宇典或解析型字典的学习算法不能同时满足处理速度、可解释性以及应用范围的要求。针对上述问题,提岀了一种基于块对角化表示的多视角字典对学习方法( Block- Diagonal Representation based Multi-view
    发表于 04-20 14:04 1次下载

    基于稀疏表示的分组训练卷积字典的图像去噪算法

    卷积稀疏编码( convolutional sparse coding,CSC)这一全局模型因字典的特殊结构而受到广泛关注,其中卷积字典学习算法(sie- based dictionary
    发表于 05-06 16:38 6次下载
    基于稀疏表示的分组训练卷积<b class='flag-5'>字典</b>的图像去噪算法

    基于残差字典及写作表达的单图像SR算法

    算法( Residual Dictionary and CollaborativeRepresentation,RDCR)。在训练环节,该算法结合字典学习及协作表达的思想,首先训练一个主字典及主投影矩阵
    发表于 05-07 13:54 8次下载

    python字典是什么

    python字典 字典(英文名 dict),它是由一系列的键值(key-value)对组合而成的数据结构。 字典中的每个键都与一个值相关联,其中 键,必须是可 hash 的值,如字符串,数值
    的头像 发表于 02-23 16:54 2660次阅读

    China-Data-Dictionary自动生成数据字典

    ./oschina_soft/gitee-China-Data-Dictionary.zip
    发表于 06-30 09:54 1次下载
    China-Data-<b class='flag-5'>Dictionary</b>自动生成数据<b class='flag-5'>字典</b>

    预训练语言模型的字典描述

    今天给大家带来一篇IJCAI2022浙大和阿里联合出品的采用对比学习的字典描述知识增强的预训练语言模型-DictBERT,全名为《Dictionary Description Knowledge
    的头像 发表于 08-11 10:37 918次阅读

    Python-字典

    dictionary (字典) **是除列表外** Python **中,最灵活的数据类型
    的头像 发表于 02-16 15:02 431次阅读
    Python-<b class='flag-5'>字典</b>

    Python序列的字典类型介绍

    字典 介绍 字典是“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含:“键对象”和“值对象”。 可以通过“键对象”实现快速获取、删除、更新对应的“值对象”
    的头像 发表于 03-08 17:35 959次阅读
    Python序列的<b class='flag-5'>字典</b>类型<b class='flag-5'>介绍</b>

    浅析Python字典的基本概念和使用方法

    Python 字典Dictionary)是一种可变、无序、键值对(Key-Value Pair)的数据结构,用于存储和管理一组数据。
    的头像 发表于 04-17 11:52 695次阅读