Python處理鍵映射值操作詳解
作為一個(gè)學(xué)完P(guān)ython基礎(chǔ)知識(shí)的測(cè)試,暗喜終于可以像RD們自己寫腳本處理任何場(chǎng)景吧,如何優(yōu)雅地寫出來代碼,接下來開啟進(jìn)階版的Python。
本期淺談一下,collection模塊關(guān)于鍵值常用的方法,跟著我一起漲知識(shí)吧~
1. 問題背景
在LeetCode刷題時(shí)候,經(jīng)常會(huì)創(chuàng)建哈希表來輔助存儲(chǔ)數(shù)據(jù)操作,一說哈希表,小白的我一馬無腦就打出了一行tmp = {}。如果在高級(jí)點(diǎn)的可以寫成 tmp = dict()。
直到有一天,遇到1個(gè)key存在多個(gè)value的問題。那要?jiǎng)?chuàng)建一個(gè)value是列表類型的字典,怎么創(chuàng)建吶?(基礎(chǔ)太差,知道一對(duì)一的)。思考許久刪了寫寫了刪,終于使用for循環(huán)判斷,搞定字典存儲(chǔ)key-多個(gè)value的值,代碼如下:
tmp = {}
students = ["C","A","B","C","D","A","A"]
for index,st in enumerate(students):
if st not in tmp:
tmp[st] = []
tmp[st].append(index)
###
{'C': [0, 3], 'A': [1, 5, 6], 'B': [2], 'D': [4]}
###
飯后找大佬show code,可想而知被大佬的神通廣大的見識(shí),直呼漲知識(shí)了!。
在 Python內(nèi)置庫(kù)中,其實(shí)是有一個(gè)collection模塊提供defaultdict() 方法來專門處理上述遇到的問題,使用defaultdict()實(shí)現(xiàn)如上需求,for循環(huán)中只需要一行代碼即可
from collections import defaultdict
tmp2 = defaultdict(list)
for index,st in enumerate(students):
tmp2[st].append(index)
##
defaultdict(<class 'list'>, {'C': [0, 3], 'A': [1, 5, 6], 'B': [2], 'D': [4]})
###聽大佬說collection模塊可不止這個(gè),還有很多好玩的。帶著疑問,去認(rèn)識(shí)collection模塊學(xué)習(xí)。
2. collections 概述
2.1 什么是collections
Python 內(nèi)置collection模塊對(duì)普通數(shù)據(jù)類型(如dict,list,tuple和set)進(jìn)行擴(kuò)展和補(bǔ)充。
Collection 模塊提供9種擴(kuò)展的數(shù)據(jù)類型對(duì)象,其中對(duì)dict字典擴(kuò)展的就有5個(gè)對(duì)象(OrderedDict、ChainMap、defaultdict、UserDict、Counter)。
2.2 Collections 內(nèi)部結(jié)構(gòu)
Collections模塊是集中了collections.abc模塊和擴(kuò)展數(shù)據(jù)類型如UserDict的容器集合模塊, Python中內(nèi)置的dict存在一些限制,不適合一些場(chǎng)景,因此collections模塊提供一些擴(kuò)展方法。
Collections.abc是從adc抽象基類中導(dǎo)出ABCMeta,abstractmethod進(jìn)行二次封裝成一系列關(guān)于集合類的接口如關(guān)于映射的mapping和mutilmapping抽象基類,用于判斷是映射關(guān)系抽象類。

實(shí)例化映射方法,一般不會(huì)直接繼承collections.abc抽象基類的,而是是繼承Python內(nèi)置的dict類對(duì)象或者collections.UserDict進(jìn)行拓展。抽象基類作為一個(gè)定義映射關(guān)系的基本接口。 同時(shí)也可以對(duì)isinstance來判斷該接口是不是映射類型。
port _collections_abc
tmp = {}
print(isinstance(tmp,collections.abc.Mapping))
###
True
### 2.3 collections 使用方法
Collections 模塊提供多種場(chǎng)景的集合類型,在特定場(chǎng)景下,使用它內(nèi)部的方法可以提高我們代碼的運(yùn)行效率。 collections 模塊文檔介紹,已經(jīng)實(shí)現(xiàn)對(duì)Python 內(nèi)置數(shù)據(jù)類型 list,set,tuple和dict都實(shí)現(xiàn)的了拓展。

Collections 模塊使用時(shí),需要進(jìn)行提前導(dǎo)入
from collections import xxxxx
3. defaultdict 方法
回到第一節(jié)問題,當(dāng)tmp[st]值不存在時(shí),Python內(nèi)部會(huì)拋出異常KeyError。
我們遇到該問題時(shí),總想的可以對(duì)tmp[st]賦值為一個(gè)默認(rèn)值default,即tmp.get(st,default)來消除異常情況。
但是當(dāng)tmp[st]更新某個(gè)值時(shí),需要再次不必要的get查詢,導(dǎo)致代碼低效。
因此collections模塊提供針對(duì)快速處理的找不鍵的情況,提供兩種方法:
setdefault(),對(duì)字典key值賦默認(rèn)值
針對(duì)第一節(jié),if判斷部分可以直接改寫為:
# if st not in tmp: # tmp[st] = [] # tmp[st].append(index) # tmp.setdefault(st,[]).append(index)
雖然提前賦值后,從查詢鍵值次數(shù)2到3次,減少一次,但是仍然還要進(jìn)行插入操作
defaultdict(),對(duì)字典進(jìn)行查找取值
Defaultdict()實(shí)現(xiàn)了專門在讀取健值就能獲取到一個(gè)默認(rèn)值的方法,是通過繼承dict進(jìn)行定義的一個(gè)子類,在子類中__missing__方法處理keyerror異常
在第一節(jié)中,通過使用defaultdict()來優(yōu)化,Python內(nèi)部是怎么運(yùn)行呢?
比如 tmp2 = defaultdict(list) 當(dāng) key- value 不存在tmp2時(shí),tmp2[key]會(huì)被進(jìn)行操作:
- 調(diào)用list()來建立一個(gè)new list,作為default_factory實(shí)例屬性
- 把new list 作為value,賦值給key鍵,放在tmp2中 最后返回這個(gè)new list的引用
需要注意是,當(dāng)defaultdict每天指定default_factory時(shí),重新不存在的鍵會(huì)觸發(fā)keyerror
然而,專門處理keyerror異常的是__missing__()方法,dict類中沒有被定義,當(dāng)__getitem__找不鍵時(shí)候,Python會(huì)自動(dòng)調(diào)用__missing__()方法。
4. Counter 方法
在有些時(shí)候,我們需要對(duì)列表中元素出現(xiàn)的次數(shù)進(jìn)行統(tǒng)計(jì),按照常規(guī)思路,仍然要使用for循環(huán)查詢更新,代碼運(yùn)行效率大大降低。
在 collections模塊中提供了Counter()方法,相等于計(jì)數(shù)器。
那么,Python內(nèi)部是怎么運(yùn)行的呢?
Counter 會(huì)給鍵準(zhǔn)備一個(gè)整數(shù)計(jì)數(shù)器 每更新一個(gè)鍵的時(shí)候都會(huì)增加這個(gè)計(jì)數(shù)器
Counter 支持對(duì)4種形式的寫法:
- 創(chuàng)建空計(jì)數(shù)器:
tmp = Counter() - 支持迭代對(duì)象如字符串:
tmp = Counter("juejin") - 支持映射對(duì)象如字典:
tmp = Counter({"a":3,"b":4}) - 支持key=value形式:
tmp = Counter(jue=1,jin=2)
Counter對(duì)象還支持求出most_common([n])求前n最大的key-value字典等方法
總結(jié)
Collections 模塊提供對(duì)可變序列映射類型高性能方法,OrderedDict、ChainMap和Counter方法可以直接進(jìn)行調(diào)用使用。如果需要重新定義則組需要繼承UserDict來實(shí)現(xiàn)個(gè)性化。
本期,我們只學(xué)習(xí)了collections模塊中關(guān)于處理鍵映射類型的相關(guān)方法,后續(xù)繼續(xù)對(duì)collections模塊關(guān)于set、list提供的擴(kuò)展方法進(jìn)行學(xué)習(xí)研究。
到此這篇關(guān)于Python處理鍵映射值操作詳解的文章就介紹到這了,更多相關(guān)Python鍵映射值操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas對(duì)dataFrame中某一個(gè)列的數(shù)據(jù)進(jìn)行處理的方法
這篇文章主要介紹了pandas對(duì)dataFrame中某一個(gè)列的數(shù)據(jù)進(jìn)行處理的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python?Pygame實(shí)戰(zhàn)之打磚塊小游戲
打磚塊最早是由雅達(dá)利公司開發(fā)的一款獨(dú)立游戲,也是無數(shù)人的童年記憶。本文將利用Python中的Pygame模塊制作經(jīng)典的打磚塊游戲,需要的可以參考一下2022-02-02
Python中XlsxWriter模塊簡(jiǎn)介與用法分析
這篇文章主要介紹了Python中XlsxWriter模塊用法,簡(jiǎn)單描述了XlsxWriter模塊的功能并結(jié)合實(shí)例形式分析了Python使用XlsxWriter模塊操作xls文件的數(shù)據(jù)插入、直方圖等相關(guān)操作技巧,需要的朋友可以參考下2018-04-04
對(duì)python 操作solr索引數(shù)據(jù)的實(shí)例詳解
今天小編就為大家分享一篇對(duì)python 操作solr索引數(shù)據(jù)的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12
python3 selenium 切換窗口的幾種方法小結(jié)
今天小編就為大家分享一篇python3 selenium 切換窗口的幾種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
如何解決pycharm中用matplotlib畫圖不顯示中文的問題
這篇文章主要介紹了如何解決pycharm中用matplotlib畫圖不顯示中文的問題,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-06-06

