99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Bi-Dictionary庫(kù)-雙向字典介紹

Linux愛(ài)好者 ? 來(lái)源:Linux愛(ài)好者 ? 作者:Linux愛(ài)好者 ? 2022-08-22 09:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

【導(dǎo)語(yǔ)】:本文介紹了Bi-Dictionary 庫(kù),即“Bi-directional Dictionary”雙向字典,顧名思義,該庫(kù)基于Python中的字典增加了由“值”訪問(wèn)鍵的功能,開(kāi)發(fā)者可以通過(guò)值來(lái)反向查找鍵,使得處理字典更加方便。同時(shí),該庫(kù)也引起了 Python 之父 Guido 的注意,因此,很有必須學(xué)習(xí)Bi-Dictionary 庫(kù)。

簡(jiǎn)介

字典是Python中最常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)之一,在日常開(kāi)發(fā)中使用的頻率很高。字典由一些鍵值對(duì)構(gòu)成,我們只能通過(guò)鍵訪問(wèn)值,但是無(wú)法通過(guò)值訪問(wèn)鍵。目前有一個(gè)第三方庫(kù)很好的解決了這個(gè)問(wèn)題 - Bi-Dictionary,通過(guò)使用它,我們可以由值訪問(wèn)鍵。該庫(kù)甚至引起了 Python 之父 Guido 的注意,因此這一特性未來(lái)可能會(huì)被加入到Python語(yǔ)法中。

安裝

我們可以使用pip安裝bidict庫(kù):

pipinstallbidict

隨后,需要導(dǎo)入該庫(kù)才能使用:

frombidictimportbidict

簡(jiǎn)單使用

初步使用

我們首先通過(guò)創(chuàng)建一個(gè)字典,該字典的鍵為國(guó)家的簡(jiǎn)稱,值為國(guó)家的全名,再用bidict初始化這個(gè)字典:

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

這樣,我們只需要使用inverse()方法,就可以通過(guò)國(guó)家全稱獲取國(guó)家簡(jiǎn)稱了:

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

結(jié)果為:USA

我們可以對(duì)比下原字典和反轉(zhuǎn)后的區(qū)別:

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

結(jié)果顯示,inverse()方法反轉(zhuǎn)了原字典的鍵值位置:

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

為何不使用Python的字典呢?

我們也可以在字典中把鍵值互換,再存儲(chǔ)一份數(shù)據(jù),這樣也能實(shí)現(xiàn)與bidict相同的效果。我們來(lái)嘗試一下:

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

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

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

這似乎看起來(lái)很完美,但是字典仍然保留了原來(lái)的數(shù)據(jù):

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

在結(jié)果中我們可以看到USA也在字典中:

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

為了避免這個(gè)問(wèn)題,只能定義一個(gè)函數(shù):

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,就非常簡(jiǎn)單了:

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

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

Bidict用起來(lái),明顯更方便!

Bidict的其他用途

在查找值之前,傳入默認(rèn)值

Bidict繼承了Python字典中的大部分特性。例如,當(dāng)我們想要通過(guò)鍵訪問(wèn)bidict中的某個(gè)值時(shí),可以傳入一個(gè)默認(rèn)值。這樣,如果bidict中沒(méi)有該值,就會(huì)將默認(rèn)值作為結(jié)果返回。

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

結(jié)果就是我們傳入的默認(rèn)值:Australia

加入新的鍵值對(duì)

Bidict加入新鍵值對(duì)的方式與Python的原生字典一樣,我們來(lái)試試:

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

結(jié)果為:

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

檢驗(yàn)Bidict中是否有某個(gè)特定值

(1)我們可以使用in關(guān)鍵字來(lái)檢查Bidict中是否有CA:

'CA' in country_abbr_bidict

我們可以得到一個(gè)布爾值,表示該鍵是否存在于Bidict中:True

(2)同樣我們也可以檢查Bidict中是否有某個(gè)值,

'Australia' in country_abbr_bidict.inverse

結(jié)果顯示Bidict中有該值:True

Pop and Delete方法

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

(1)pop()方法可以從Bidict中彈出鍵值對(duì)

country_abbr_bidict.pop('AU')

會(huì)返回該鍵對(duì)應(yīng)的值:Australia

我們?cè)倏纯碆idict:country_abbr_bidict

發(fā)現(xiàn)里面沒(méi)有AU這個(gè)鍵值對(duì)了:bidict({'US': 'The United States of America', 'CA': 'Canada'})

(2)delete()方法可以通過(guò)鍵或者值的方式刪除鍵值對(duì)

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

結(jié)果顯示刪除成功:bidict({'US': 'The United States of America'})

約束

Python的設(shè)計(jì)理念是當(dāng)程序出現(xiàn)錯(cuò)誤時(shí),一定要顯示出來(lái),Bidict的設(shè)計(jì)也遵循了這一點(diǎn)。Bidict的一個(gè)約束是鍵、值都要唯一,這是因?yàn)橹狄灿锌赡軙?huì)被當(dāng)作鍵使用。因此,當(dāng)我們想在Bidict中加入一個(gè)新的鍵值對(duì)(該鍵值對(duì)的值已經(jīng)被其他鍵使用),就會(huì)報(bào)錯(cuò)。例如,我們想把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'

會(huì)產(chǎn)生如下錯(cuò)誤:

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()方法來(lái)避免這一錯(cuò)誤:country_abbr_bidict.forceput('USA', 'The United States of America')

但是,如果出現(xiàn)了兩個(gè)鍵的值相同這種情況,該方法會(huì)把原來(lái)的鍵覆蓋:bidict({'US': 'The United States of America'})

其他特性

更新多個(gè)鍵值對(duì)

putall()方法可以同時(shí)加入多個(gè)鍵值對(duì)到Bidict中,但傳入的參數(shù)必須是可迭代的。

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

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

當(dāng)某個(gè)鍵值對(duì)無(wú)法傳入時(shí),那么其他鍵值對(duì)也無(wú)法傳入:

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

這里出現(xiàn)了報(bào)錯(cuò):

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

而其他鍵值對(duì)也沒(méi)有傳入到Bidict中:bidict({'US': 'United States of America'})

forceupdate()方法的優(yōu)先級(jí)

如果我們想使用該方法傳入多個(gè)鍵值對(duì),對(duì)Bidict進(jìn)行更新,那么就要注意傳入數(shù)據(jù)的先后順序了。

如果把USA放到最后,那么最終Bidict就會(huì)使用該鍵:

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

結(jié)果為:bidict({'USA': 'The United States of America'})

如果把US放到最后,那么字典就會(huì)將US作為鍵。

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

結(jié)果為:bidict({'US': 'The United States of America'})

與其他數(shù)據(jù)結(jié)構(gòu)交互

Bidict可以轉(zhuǎn)換為其他數(shù)據(jù)結(jié)構(gòu),反之亦然。例如,我們可以把Bidict轉(zhuǎn)換為字典:dict(country_abbr_bidict)

結(jié)果為:{'US': 'United States of America'}

我們?cè)侔炎值滢D(zhuǎn)換為Bidict: bidict(dict(country_abbr_bidict))

結(jié)果為:bidict({'US': 'United States of America'})

結(jié)論

在本文中,我介紹了Bi-Dictionary庫(kù)-雙向字典,也稱為Bidict。它不僅改進(jìn)了Python字典的缺點(diǎn),而且遵循了Python的設(shè)計(jì)原則。非常值得學(xué)習(xí)!

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4379

    瀏覽量

    64803
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40730
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

    86675

原文標(biāo)題:這個(gè)字典庫(kù)引起了 Python 之父的注意!你用過(guò)嗎?

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何手動(dòng)編輯MPLAB的拼寫(xiě)檢查字典

    如何手動(dòng)編輯MPLAB的拼寫(xiě)檢查字典,例如Eclipse的用戶字典?我試圖手動(dòng)糾正MPLAB拒絕接受的拼寫(xiě)值,而它卻用“環(huán)繞/ /”來(lái)聲明(見(jiàn)附件)。謝斯,思想? 以上來(lái)自于百度翻譯 以下為原文
    發(fā)表于 11-07 15:09

    OpenBravo數(shù)據(jù)庫(kù)結(jié)構(gòu)基本分析

    一.表前綴的意義A_:基本資料管理(asset management)AD_:基礎(chǔ)字典(application dictionary)C_:核心功能I_:導(dǎo)入數(shù)據(jù)的臨時(shí)表和過(guò)程M_:物料管理
    發(fā)表于 07-11 06:50

    SCL使用Ref和Variant實(shí)現(xiàn)Dictionary 相關(guān)資料分享

    在C#中,Dictionary的主要用途是提供快速的基于鍵-值對(duì)的數(shù)據(jù)存儲(chǔ)和查找。Dictionary的結(jié)構(gòu)是這樣的:Dictionary。其中key一般為基礎(chǔ)數(shù)據(jù)類型(當(dāng)然也可以是復(fù)雜
    發(fā)表于 07-02 07:16

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

    Dictionary的主要用途是什么?Dictionary的結(jié)構(gòu)是由哪些部分組成的?Dictionary的功能塊接口有哪些?其作用是什么?
    發(fā)表于 07-02 07:31

    Addict 一個(gè)寫(xiě)起來(lái)令人極其舒適的字典模塊

    Addit 是一個(gè)Python模塊,除了提供標(biāo)準(zhǔn)的字典語(yǔ)法外,Addit 生成的字典的值既可以使用屬性來(lái)獲取,也可以使用屬性進(jìn)行設(shè)置。這意味著你不用再寫(xiě)這樣的字典了:body = { 'query
    發(fā)表于 06-21 16:13

    The Illustrated Dictionary of

    The Illustrated Dictionary of Electronics Acknowledgments Illustrations in this book were
    發(fā)表于 09-09 09:35 ?3次下載
    The Illustrated <b class='flag-5'>Dictionary</b> of

    一種基于塊對(duì)角化表示的多視角字典對(duì)學(xué)習(xí)方法

    考慮一種合成型宇典或解析型字典的學(xué)習(xí)算法不能同時(shí)滿足處理速度、可解釋性以及應(yīng)用范圍的要求。針對(duì)上述問(wèn)題,提岀了一種基于塊對(duì)角化表示的多視角字典對(duì)學(xué)習(xí)方法( Block- Diagonal Representation based Multi-view
    發(fā)表于 04-20 14:04 ?1次下載

    基于稀疏表示的分組訓(xùn)練卷積字典的圖像去噪算法

    卷積稀疏編碼( convolutional sparse coding,CSC)這一全局模型因字典的特殊結(jié)構(gòu)而受到廣泛關(guān)注,其中卷積字典學(xué)習(xí)算法(sie- based dictionary
    發(fā)表于 05-06 16:38 ?6次下載
    基于稀疏表示的分組訓(xùn)練卷積<b class='flag-5'>字典</b>的圖像去噪算法

    基于殘差字典及寫(xiě)作表達(dá)的單圖像SR算法

    算法( Residual Dictionary and CollaborativeRepresentation,RDCR)。在訓(xùn)練環(huán)節(jié),該算法結(jié)合字典學(xué)習(xí)及協(xié)作表達(dá)的思想,首先訓(xùn)練一個(gè)主字典及主投影矩陣
    發(fā)表于 05-07 13:54 ?8次下載

    python字典是什么

    python字典 字典(英文名 dict),它是由一系列的鍵值(key-value)對(duì)組合而成的數(shù)據(jù)結(jié)構(gòu)。 字典中的每個(gè)鍵都與一個(gè)值相關(guān)聯(lián),其中 鍵,必須是可 hash 的值,如字符串,數(shù)值等 值
    的頭像 發(fā)表于 02-23 16:54 ?3690次閱讀

    China-Data-Dictionary自動(dòng)生成數(shù)據(jù)字典

    ./oschina_soft/gitee-China-Data-Dictionary.zip
    發(fā)表于 06-30 09:54 ?1次下載
    China-Data-<b class='flag-5'>Dictionary</b>自動(dòng)生成數(shù)據(jù)<b class='flag-5'>字典</b>

    預(yù)訓(xùn)練語(yǔ)言模型的字典描述

    今天給大家?guī)?lái)一篇IJCAI2022浙大和阿里聯(lián)合出品的采用對(duì)比學(xué)習(xí)的字典描述知識(shí)增強(qiáng)的預(yù)訓(xùn)練語(yǔ)言模型-DictBERT,全名為《Dictionary Description Knowledge
    的頭像 發(fā)表于 08-11 10:37 ?1383次閱讀

    Python-字典

    dictionary (字典) **是除列表外** Python **中,最靈活的數(shù)據(jù)類型
    的頭像 發(fā)表于 02-16 15:02 ?882次閱讀
    Python-<b class='flag-5'>字典</b>

    Python序列的字典類型介紹

    字典 介紹 字典是“鍵值對(duì)”的無(wú)序可變序列,字典中的每個(gè)元素都是一個(gè)“鍵值對(duì)”,包含:“鍵對(duì)象”和“值對(duì)象”。 可以通過(guò)“鍵對(duì)象”實(shí)現(xiàn)快速獲取、刪除、更新對(duì)應(yīng)的“值對(duì)象”
    的頭像 發(fā)表于 03-08 17:35 ?1643次閱讀
    Python序列的<b class='flag-5'>字典</b>類型<b class='flag-5'>介紹</b>

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

    Python 字典Dictionary)是一種可變、無(wú)序、鍵值對(duì)(Key-Value Pair)的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)和管理一組數(shù)據(jù)。
    的頭像 發(fā)表于 04-17 11:52 ?1174次閱讀