【導(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,incountry_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,incountry_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í)!
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4379瀏覽量
64803 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(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)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
如何手動(dòng)編輯MPLAB的拼寫(xiě)檢查字典
OpenBravo數(shù)據(jù)庫(kù)結(jié)構(gòu)基本分析
SCL使用Ref和Variant實(shí)現(xiàn)Dictionary 相關(guān)資料分享
Dictionary的功能塊接口有哪些?其作用是什么?
Addict 一個(gè)寫(xiě)起來(lái)令人極其舒適的字典模塊
The Illustrated Dictionary of

一種基于塊對(duì)角化表示的多視角字典對(duì)學(xué)習(xí)方法
基于稀疏表示的分組訓(xùn)練卷積字典的圖像去噪算法

基于殘差字典及寫(xiě)作表達(dá)的單圖像SR算法
python字典是什么
China-Data-Dictionary自動(dòng)生成數(shù)據(jù)字典

預(yù)訓(xùn)練語(yǔ)言模型的字典描述
Python序列的字典類型介紹

評(píng)論