網站首頁 編程語言 正文
作為一個學完Python基礎知識的測試,暗喜終于可以像RD們自己寫腳本處理任何場景吧,如何優雅地寫出來代碼,接下來開啟進階版的Python。
本期淺談一下,collection模塊關于鍵值常用的方法,跟著我一起漲知識吧~
1. 問題背景
在LeetCode刷題時候,經常會創建哈希表來輔助存儲數據操作,一說哈希表,小白的我一馬無腦就打出了一行tmp = {}
。如果在高級點的可以寫成 tmp = dict()
。
直到有一天,遇到1個key存在多個value的問題。那要創建一個value是列表類型的字典,怎么創建吶?(基礎太差,知道一對一的)。思考許久刪了寫寫了刪,終于使用for循環判斷,搞定字典存儲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內置庫中,其實是有一個collection模塊提供defaultdict() 方法來專門處理上述遇到的問題,使用defaultdict()實現如上需求,for循環中只需要一行代碼即可
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模塊可不止這個,還有很多好玩的。帶著疑問,去認識collection模塊學習。
2. collections 概述
2.1 什么是collections
Python 內置collection模塊對普通數據類型(如dict,list,tuple和set)進行擴展和補充。
Collection 模塊提供9種擴展的數據類型對象,其中對dict字典擴展的就有5個對象(OrderedDict、ChainMap、defaultdict、UserDict、Counter)。
2.2 Collections 內部結構
Collections模塊是集中了collections.abc模塊和擴展數據類型如UserDict的容器集合模塊, Python中內置的dict存在一些限制,不適合一些場景,因此collections模塊提供一些擴展方法。
Collections.abc是從adc抽象基類中導出ABCMeta,abstractmethod進行二次封裝成一系列關于集合類的接口如關于映射的mapping和mutilmapping抽象基類,用于判斷是映射關系抽象類。
實例化映射方法,一般不會直接繼承collections.abc抽象基類的,而是是繼承Python內置的dict類對象或者collections.UserDict進行拓展。抽象基類作為一個定義映射關系的基本接口。 同時也可以對isinstance來判斷該接口是不是映射類型。
port _collections_abc tmp = {} print(isinstance(tmp,collections.abc.Mapping)) ### True ###
2.3 collections 使用方法
Collections 模塊提供多種場景的集合類型,在特定場景下,使用它內部的方法可以提高我們代碼的運行效率。 collections 模塊文檔介紹,已經實現對Python 內置數據類型 list,set,tuple和dict都實現的了拓展。
Collections 模塊使用時,需要進行提前導入
from collections import xxxxx
3. defaultdict 方法
回到第一節問題,當tmp[st]值不存在時,Python內部會拋出異常KeyError。
我們遇到該問題時,總想的可以對tmp[st]賦值為一個默認值default,即tmp.get(st,default)來消除異常情況。
但是當tmp[st]更新某個值時,需要再次不必要的get查詢,導致代碼低效。
因此collections模塊提供針對快速處理的找不鍵的情況,提供兩種方法:
setdefault(),對字典key值賦默認值
針對第一節,if判斷部分可以直接改寫為:
# if st not in tmp: # tmp[st] = [] # tmp[st].append(index) # tmp.setdefault(st,[]).append(index)
雖然提前賦值后,從查詢鍵值次數2到3次,減少一次,但是仍然還要進行插入操作
defaultdict(),對字典進行查找取值
Defaultdict()實現了專門在讀取健值就能獲取到一個默認值的方法,是通過繼承dict進行定義的一個子類,在子類中__missing__方法處理keyerror異常
在第一節中,通過使用defaultdict()來優化,Python內部是怎么運行呢?
比如 tmp2 = defaultdict(list) 當 key- value 不存在tmp2時,tmp2[key]會被進行操作:
- 調用list()來建立一個new list,作為default_factory實例屬性
- 把new list 作為value,賦值給key鍵,放在tmp2中 最后返回這個new list的引用
需要注意是,當defaultdict每天指定default_factory時,重新不存在的鍵會觸發keyerror
然而,專門處理keyerror異常的是__missing__()方法,dict類中沒有被定義,當__getitem__找不鍵時候,Python會自動調用__missing__()方法。
4. Counter 方法
在有些時候,我們需要對列表中元素出現的次數進行統計,按照常規思路,仍然要使用for循環查詢更新,代碼運行效率大大降低。
在 collections模塊中提供了Counter()方法,相等于計數器。
那么,Python內部是怎么運行的呢?
Counter 會給鍵準備一個整數計數器 每更新一個鍵的時候都會增加這個計數器
Counter 支持對4種形式的寫法:
- 創建空計數器:
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字典等方法
總結
Collections 模塊提供對可變序列映射類型高性能方法,OrderedDict、ChainMap和Counter方法可以直接進行調用使用。如果需要重新定義則組需要繼承UserDict來實現個性化。
本期,我們只學習了collections模塊中關于處理鍵映射類型的相關方法,后續繼續對collections模塊關于set、list提供的擴展方法進行學習研究。
原文鏈接:https://juejin.cn/post/7164673886183751717
- 上一篇:C語言計算分段函數問題_C 語言
- 下一篇:React組件的使用詳細講解_React
相關推薦
- 2022-09-29 C#正則表達式(Regex類)用法實例總結_C#教程
- 2022-04-25 深入理解React?三大核心屬性_React
- 2022-03-24 C語言函數指針詳解_C 語言
- 2022-07-08 圖文詳解Nginx多種匹配方式_nginx
- 2022-07-10 Callable接口的使用詳解
- 2022-09-27 如何在Python中利用matplotlib.pyplot畫出函數圖詳解_python
- 2022-08-18 python打印日志方法的使用教程(logging模塊)_python
- 2022-09-13 Python使用os模塊實現更高效地讀寫文件_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支