Python內(nèi)置模塊Collections的使用教程詳解
1、模塊說明
collections 是 Python 的一個(gè)內(nèi)置模塊,所謂內(nèi)置模塊的意思是指 Python 內(nèi)部封裝好的模塊,無需安裝即可直接使用。
- collections 包含了一些特殊的容器,針對(duì) Python 內(nèi)置的容器,例如: list、dict、set、tuple,提供了另一種選擇。
- namedtuple: 可以創(chuàng)建包含名稱的 tuple。
- deque: 類似于 list 的容器,可以快速的在隊(duì)列頭部和尾部添加、刪除元素。
- OrderedDict: dict的子類,可以記住元素的添加順序。
- defaultdict: dict的子類,可以調(diào)用提供默認(rèn)值的函數(shù)。
- Counter: dict的子類,計(jì)算可hash的對(duì)象。
2、 實(shí)戰(zhàn)代碼
(1) testNamedTuple函數(shù)
Python 提供了很多非常好用的基本類型,比如不可變類型 tuple,我們可以輕松地用它來表示一個(gè)二元向量。
namedtuple 是一個(gè)函數(shù),它用來創(chuàng)建一個(gè)自定義的 tuple 對(duì)象,并且規(guī)定了 tuple 元素的個(gè)數(shù),并可以用屬性而不是索引來引用 tuple 的某個(gè)元素。
如此一來,我們用 namedtuple 可以很方便地定義一種數(shù)據(jù)類型,它具備 tuple 的不變性,又可以根據(jù)屬性來引用,使用十分方便。
本示例中我們使用了一個(gè)三維坐標(biāo) x,y,z 來定義一個(gè) tuple 對(duì)象,對(duì)象元素有3個(gè),然后通過坐標(biāo)值來引用相應(yīng)的值即可。
from collections import namedtuple from collections import deque from collections import defaultdict from collections import OrderedDict from collections import Counter def testNamedTuple(): vector=namedtuple('vector',['x','y','z']) flag=vector(3,4,5) print(type(flag)) print(isinstance(flag,vector)) print(isinstance(flag,tuple)) #通過這里的判定我們就可以知曉它是元組類型 print(flag.x,flag.y,flag.z)
(2) testDeque函數(shù)
deque是棧和隊(duì)列的一種廣義實(shí)現(xiàn),deque是 "double-end queue" 的簡(jiǎn)稱。
deque支持線程安全、有效內(nèi)存地以近似O(1)的性能在 deque 的兩端插入和刪除元素,盡管 list 也支持相似的操作,但是它主要在固定長(zhǎng)度操作上的優(yōu)化,從而在 pop(0) 和 insert(0,v)(會(huì)改變數(shù)據(jù)的位置和大小)上有O(n)的時(shí)間復(fù)雜度。
在數(shù)據(jù)結(jié)構(gòu)中,我們知道隊(duì)列和堆棧是兩個(gè)非常重要的數(shù)據(jù)類型,一個(gè)先進(jìn)先出,一個(gè)后進(jìn)先出。
在 python 中,使用 list 存儲(chǔ)數(shù)據(jù)時(shí),按索引訪問元素很快,但是插入和刪除元素就很慢,因?yàn)?list 是線性存儲(chǔ),數(shù)據(jù)量大的時(shí)候,插入和刪除效率很低。
deque是為了高效實(shí)現(xiàn)插入和刪除操作的雙向鏈表結(jié)構(gòu),非常適合實(shí)現(xiàn)隊(duì)列和堆棧這樣的數(shù)據(jù)結(jié)構(gòu)。
def testDeque(): list1=[x*x for x in range(101)] delist=deque(list1) #對(duì)列表進(jìn)行了一次再處理,讓list1列表變成了雙向鏈表結(jié)構(gòu) delist.append(1000)#將x添加到deque的右側(cè) delist.appendleft(2000)#將x添加到deque的左側(cè) delist.pop(1000)#移除和返回deque中最右側(cè)的元素,如果沒有元素,將會(huì)報(bào)出IndexError; delist.popleft()#移除和返回deque中最左側(cè)的元素,如果沒有元素,將會(huì)報(bào)出IndexError; delist.count(1)#返回deque中元素等于1的個(gè)數(shù) delist.remove(10000)#移除第一次出現(xiàn)的value,如果沒有找到,報(bào)出ValueError; delist.reverse()#反轉(zhuǎn)deque中的元素,并返回None; list2=[1,3,4,5] delist.extend(list2)#將可迭代變量iterable中的元素添加至deque的右側(cè) delist.extendleft(list2)#將變量iterable中的元素添加至deque的左側(cè),往左側(cè)添加序列的順序與可迭代變量iterable中的元素相反 delist.maxlen()#只讀的屬性,deque的最大長(zhǎng)度,如果無解,就返回None delist.rotate(1)#從右側(cè)反轉(zhuǎn)n步,如果n為負(fù)數(shù),則從左側(cè)反轉(zhuǎn) delist.clear()#將deque中的元素全部刪除,最后長(zhǎng)度為0;
(3)testDefaultdict函數(shù)
defaultdict是內(nèi)置數(shù)據(jù)類型 dict 的一個(gè)子類,基本功能與 dict 一樣,只是重寫了一個(gè)方法__missing__(key)和增加了一個(gè)可寫的對(duì)象變量 default_factory。
使用 dict 字典類型時(shí),如果引用的 key 不存在,就會(huì)拋出 KeyError。如果希望 Key 不存在時(shí),返回一個(gè)默認(rèn)值,就可以用 defaultdict。
def testDefaultdict(): dict1= defaultdict(lambda: 'default') #Key不存在時(shí),返回一個(gè)默認(rèn)值,就可以用default,defaultdict的其他行為跟dict是完全一樣的 dict1["k1"]="v1" print(dict1["k2"]) list2= [('yellow',11),('blue',2),('yellow',3),('blue',4),('red',5),('red',10)] dict1 = defaultdict(list)#使用list作為default_factory,很容易將一個(gè)key-value的序列轉(zhuǎn)換為一個(gè)關(guān)于list的詞典 for k,v in list2: dict1[k].append(v) print(dict1)
(4) testOrderedDict函數(shù)
OrderedDict類似于正常的詞典,只是它記住了元素插入的順序,當(dāng)在有序的詞典上迭代時(shí),返回的元素就是它們第一次添加的順序。這樣 dict 就是一個(gè)有序的字典。
使用 dict 時(shí),key 是無序的。在對(duì) dict 做迭代時(shí),我們無法確定 key 的順序。但是如果想要保持 key 的順序,可以用 OrderedDict。
def testOrderedDict(): dict1=dict([('aaa', 111), ('ddd',444),('bbb', 222), ('ccc', 333)]) print(dict1) dict2 = OrderedDict([('ddd',444),('aaa', 111), ('bbb', 222), ('ccc', 333)])#OrderedDict的key會(huì)按照插入的順序排列,不是key本身排序 print(dict2) dict3 = {"banana": 33, "apple": 222, "pear": 1, "orange": 4444} # dict sorted by key dict4=OrderedDict(sorted(dict3.items(), key=lambda t: t[0])) print("dict4",dict4) # dict sorted by value dict5=OrderedDict(sorted(dict3.items(), key=lambda t: t[1])) print("dict5",dict5) # dict sorted by length of key string dict6 = OrderedDict(sorted(dict3.items(), key=lambda t: len(t[0]))) print("dict6",dict6) print(dict6['apple'])
(5) testCounter函數(shù)
def testCounter(): '''counter可以支持方便、快速的計(jì)數(shù)''' str1="abcdefgabcedergeghdjlkabcdefe" #將可迭代的字符串初始化counter str2=Counter(str1) print(str2) #從輸出的內(nèi)容來看,Counter實(shí)際上也是dict的一個(gè)子類 for k,v in str2.items(): print(k,v) dict3 = {"banana": 33, "apple": 222, "pear": 1, "orange": 4444,"apples":2}#將dict初始化counter dict4=Counter(dict3) print(dict4) print(dict4["test"])#Counter對(duì)象類似于字典,如果某個(gè)項(xiàng)缺失,會(huì)返回0,而不是報(bào)出KeyError; dict5=Counter(high=9,age=33,money=-1)#將args初始化counter print(dict5) #elements返回一個(gè)迭代器,每個(gè)元素重復(fù)的次數(shù)為它的數(shù)目,順序是任意的順序,如果一個(gè)元素的數(shù)目少于1,那么elements()就會(huì)忽略它; list1=list(dict5.elements()) print(list1) #most_common返回一個(gè)列表,包含counter中n個(gè)最大數(shù)目的元素 #,如果忽略n或者為None,most_common()將會(huì)返回counter中的所有元素,元素有著相同數(shù)目的將會(huì)以任意順序排列; str1 = "abcdefgabcedergeghdjlkabcdefe" list1=Counter(str1).most_common(3) print(list1) if __name__ == '__main__': # testNamedTuple() # testCounter() testDefaultdict() # testDeque() # testOrderedDict()
到此這篇關(guān)于Python內(nèi)置模塊Collections的使用教程詳解的文章就介紹到這了,更多相關(guān)Python Collections內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)微信自動(dòng)回復(fù)及批量添加好友功能
這篇文章主要介紹了python實(shí)現(xiàn)微信自動(dòng)回復(fù)及python 批量生成微信添加好友截圖功能的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07一篇文章帶你了解python標(biāo)準(zhǔn)庫--sys模塊
這篇文章主要介紹了Python標(biāo)準(zhǔn)庫之Sys模塊使用詳解,本文講解了使用sys模塊獲得腳本的參數(shù)、處理模塊、使用sys模塊操作模塊搜索路徑、使用sys模塊查找內(nèi)建模塊、使用sys模塊查找已導(dǎo)入的模塊等使用案例,需要的朋友可以參考下2021-08-08Python利用zhconv模塊進(jìn)行簡(jiǎn)繁體字轉(zhuǎn)換的案例演示
zhconv是一個(gè)Python庫,提供了簡(jiǎn)體字和繁體字之間的轉(zhuǎn)換功能,本教程將向你展示如何使用zhconv模塊來實(shí)現(xiàn)簡(jiǎn)繁體字的互轉(zhuǎn),并附帶一個(gè)案例演示,感興趣的朋友可以參考一下2024-05-05詳解Tensorflow數(shù)據(jù)讀取有三種方式(next_batch)
本篇文章主要介紹了Tensorflow數(shù)據(jù)讀取有三種方式(next_batch),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02python隨機(jī)數(shù)分布random測(cè)試
這篇文章主要為大家詳細(xì)介紹了python隨機(jī)數(shù)分布random的測(cè)試,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08用Python編寫一個(gè)簡(jiǎn)單的Lisp解釋器的教程
這篇文章主要介紹了用Python編寫一個(gè)簡(jiǎn)單的Lisp解釋器的教程,Lisp是一種源碼簡(jiǎn)單的函數(shù)式編程語言,本文主要介紹對(duì)其中的一個(gè)子集Scheme的解釋器開發(fā),需要的朋友可以參考下2015-04-04python unichr函數(shù)知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于python unichr函數(shù)的知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-12-12Python內(nèi)建類型str源碼學(xué)習(xí)
這篇文章主要為大家介紹了Python內(nèi)建類型str的源碼學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05