欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python處理鍵映射值操作詳解

 更新時間:2022年11月14日 09:18:50   作者:盆友圈的小可愛  
這篇文章主要為大家詳細(xì)介紹了Python中的處理鍵映射值操作的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下

作為一個學(xué)完P(guān)ython基礎(chǔ)知識的測試,暗喜終于可以像RD們自己寫腳本處理任何場景吧,如何優(yōu)雅地寫出來代碼,接下來開啟進階版的Python。

本期淺談一下,collection模塊關(guān)于鍵值常用的方法,跟著我一起漲知識吧~

1. 問題背景

在LeetCode刷題時候,經(jīng)常會創(chuàng)建哈希表來輔助存儲數(shù)據(jù)操作,一說哈希表,小白的我一馬無腦就打出了一行tmp = {}。如果在高級點的可以寫成 tmp = dict()。

直到有一天,遇到1個key存在多個value的問題。那要創(chuàng)建一個value是列表類型的字典,怎么創(chuàng)建吶?(基礎(chǔ)太差,知道一對一的)。思考許久刪了寫寫了刪,終于使用for循環(huán)判斷,搞定字典存儲key-多個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,可想而知被大佬的神通廣大的見識,直呼漲知識了!。

在 Python內(nèi)置庫中,其實是有一個collection模塊提供defaultdict() 方法來專門處理上述遇到的問題,使用defaultdict()實現(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模塊可不止這個,還有很多好玩的。帶著疑問,去認(rèn)識collection模塊學(xué)習(xí)。

2. collections 概述

2.1 什么是collections

Python 內(nèi)置collection模塊對普通數(shù)據(jù)類型(如dict,list,tuple和set)進行擴展和補充。

Collection 模塊提供9種擴展的數(shù)據(jù)類型對象,其中對dict字典擴展的就有5個對象(OrderedDict、ChainMap、defaultdict、UserDict、Counter)。

2.2 Collections 內(nèi)部結(jié)構(gòu)

Collections模塊是集中了collections.abc模塊和擴展數(shù)據(jù)類型如UserDict的容器集合模塊, Python中內(nèi)置的dict存在一些限制,不適合一些場景,因此collections模塊提供一些擴展方法。

Collections.abc是從adc抽象基類中導(dǎo)出ABCMeta,abstractmethod進行二次封裝成一系列關(guān)于集合類的接口如關(guān)于映射的mappingmutilmapping抽象基類,用于判斷是映射關(guān)系抽象類。

實例化映射方法,一般不會直接繼承collections.abc抽象基類的,而是是繼承Python內(nèi)置的dict類對象或者collections.UserDict進行拓展。抽象基類作為一個定義映射關(guān)系的基本接口。 同時也可以對isinstance來判斷該接口是不是映射類型。

port _collections_abc 

tmp = {} 
print(isinstance(tmp,collections.abc.Mapping)) 

### 
True 
### 

2.3 collections 使用方法

Collections 模塊提供多種場景的集合類型,在特定場景下,使用它內(nèi)部的方法可以提高我們代碼的運行效率。 collections 模塊文檔介紹,已經(jīng)實現(xiàn)對Python 內(nèi)置數(shù)據(jù)類型 list,set,tuple和dict都實現(xiàn)的了拓展。

Collections 模塊使用時,需要進行提前導(dǎo)入

from collections import xxxxx

3. defaultdict 方法

回到第一節(jié)問題,當(dāng)tmp[st]值不存在時,Python內(nèi)部會拋出異常KeyError。

我們遇到該問題時,總想的可以對tmp[st]賦值為一個默認(rèn)值default,即tmp.get(st,default)來消除異常情況。

但是當(dāng)tmp[st]更新某個值時,需要再次不必要的get查詢,導(dǎo)致代碼低效。

因此collections模塊提供針對快速處理的找不鍵的情況,提供兩種方法:

setdefault(),對字典key值賦默認(rèn)值

針對第一節(jié),if判斷部分可以直接改寫為:

# if st not in tmp: 
#    tmp[st] = [] 
# tmp[st].append(index) 
#
tmp.setdefault(st,[]).append(index)

雖然提前賦值后,從查詢鍵值次數(shù)2到3次,減少一次,但是仍然還要進行插入操作

defaultdict(),對字典進行查找取值

Defaultdict()實現(xiàn)了專門在讀取健值就能獲取到一個默認(rèn)值的方法,是通過繼承dict進行定義的一個子類,在子類中__missing__方法處理keyerror異常

在第一節(jié)中,通過使用defaultdict()來優(yōu)化,Python內(nèi)部是怎么運行呢?

比如 tmp2 = defaultdict(list) 當(dāng) key- value 不存在tmp2時,tmp2[key]會被進行操作:

  • 調(diào)用list()來建立一個new list,作為default_factory實例屬性
  • 把new list 作為value,賦值給key鍵,放在tmp2中 最后返回這個new list的引用

需要注意是,當(dāng)defaultdict每天指定default_factory時,重新不存在的鍵會觸發(fā)keyerror

然而,專門處理keyerror異常的是__missing__()方法,dict類中沒有被定義,當(dāng)__getitem__找不鍵時候,Python會自動調(diào)用__missing__()方法。

4. Counter 方法

在有些時候,我們需要對列表中元素出現(xiàn)的次數(shù)進行統(tǒng)計,按照常規(guī)思路,仍然要使用for循環(huán)查詢更新,代碼運行效率大大降低。

在 collections模塊中提供了Counter()方法,相等于計數(shù)器。

那么,Python內(nèi)部是怎么運行的呢?

Counter 會給鍵準(zhǔn)備一個整數(shù)計數(shù)器 每更新一個鍵的時候都會增加這個計數(shù)器

Counter 支持對4種形式的寫法:

  • 創(chuàng)建空計數(shù)器:tmp = Counter()
  • 支持迭代對象如字符串: tmp = Counter("juejin")
  • 支持映射對象如字典:tmp = Counter({"a":3,"b":4})
  • 支持key=value形式:tmp = Counter(jue=1,jin=2)

Counter對象還支持求出most_common([n])求前n最大的key-value字典等方法

總結(jié)

Collections 模塊提供對可變序列映射類型高性能方法,OrderedDict、ChainMap和Counter方法可以直接進行調(diào)用使用。如果需要重新定義則組需要繼承UserDict來實現(xiàn)個性化。

本期,我們只學(xué)習(xí)了collections模塊中關(guān)于處理鍵映射類型的相關(guān)方法,后續(xù)繼續(xù)對collections模塊關(guān)于set、list提供的擴展方法進行學(xué)習(xí)研究。

到此這篇關(guān)于Python處理鍵映射值操作詳解的文章就介紹到這了,更多相關(guān)Python鍵映射值操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python進程結(jié)束后端口占用問題解析

    python進程結(jié)束后端口占用問題解析

    這篇文章主要為大家介紹了python中在進程結(jié)束后端口依然被占用的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-01-01
  • Python應(yīng)用之利用pyecharts畫中國地圖

    Python應(yīng)用之利用pyecharts畫中國地圖

    這篇文章主要介紹了Python應(yīng)用之利用pyecharts畫中國地圖,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python的CGIHTTPServer交互實現(xiàn)詳解

    Python的CGIHTTPServer交互實現(xiàn)詳解

    本篇文章主要給大家詳細(xì)分析了Python的CGIHTTPServer交互實現(xiàn)過程以及相關(guān)代碼分享,有興趣的參考學(xué)習(xí)下。
    2018-02-02
  • Python實現(xiàn)的視頻播放器功能完整示例

    Python實現(xiàn)的視頻播放器功能完整示例

    這篇文章主要介紹了Python實現(xiàn)的視頻播放器功能,結(jié)合完整實例形式分析了Python基于pyglet庫實現(xiàn)視頻播放功能的相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • PyQt5每天必學(xué)之拖放事件

    PyQt5每天必學(xué)之拖放事件

    這篇文章主要為大家詳細(xì)介紹了PyQt5每天必學(xué)之拖放事件的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • PyQt5+QtChart實現(xiàn)繪制曲線圖

    PyQt5+QtChart實現(xiàn)繪制曲線圖

    QChart是一個QGraphicScene中可以顯示的QGraphicsWidget。本文將利用QtChart實現(xiàn)曲線圖的繪制,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-12-12
  • Python openpyxl讀取單元格字體顏色過程解析

    Python openpyxl讀取單元格字體顏色過程解析

    這篇文章主要介紹了Python openpyxl讀取單元格字體顏色過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Python Pygame實戰(zhàn)之水果忍者游戲的實現(xiàn)

    Python Pygame實戰(zhàn)之水果忍者游戲的實現(xiàn)

    大家還記得水果忍者這個游戲嗎?想當(dāng)年,這也是個風(fēng)靡全國的游戲,基本每個人都玩過。今天小編就用Python中的Pygame庫復(fù)刻這一經(jīng)典游戲,需要的可以參考一下
    2022-02-02
  • Python實現(xiàn)輕松防止屏幕截圖的技巧分享

    Python實現(xiàn)輕松防止屏幕截圖的技巧分享

    屏幕截圖是一種常見的用于記錄信息或者監(jiān)控用戶活動的方法,為了保護隱私和數(shù)據(jù)安全,可以通過使用Python編寫一些防護措施來防止他人截取我們的屏幕,下面我們就來學(xué)習(xí)一下有哪些具體操作吧
    2023-12-12
  • python實現(xiàn)Oracle查詢分組的方法示例

    python實現(xiàn)Oracle查詢分組的方法示例

    這篇文章主要介紹了python實現(xiàn)Oracle查詢分組的方法,結(jié)合實例形式分析了python使用group by子句及having子句實現(xiàn)Oracle查詢分組的相關(guān)操作技巧,需要的朋友可以參考下
    2020-04-04

最新評論