Python內(nèi)置模塊Collections的使用教程詳解
1、模塊說明
collections 是 Python 的一個(gè)內(nèi)置模塊,所謂內(nèi)置模塊的意思是指 Python 內(nèi)部封裝好的模塊,無需安裝即可直接使用。
- collections 包含了一些特殊的容器,針對 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的對象。
2、 實(shí)戰(zhàn)代碼
(1) testNamedTuple函數(shù)
Python 提供了很多非常好用的基本類型,比如不可變類型 tuple,我們可以輕松地用它來表示一個(gè)二元向量。
namedtuple 是一個(gè)函數(shù),它用來創(chuàng)建一個(gè)自定義的 tuple 對象,并且規(guī)定了 tuple 元素的個(gè)數(shù),并可以用屬性而不是索引來引用 tuple 的某個(gè)元素。
如此一來,我們用 namedtuple 可以很方便地定義一種數(shù)據(jù)類型,它具備 tuple 的不變性,又可以根據(jù)屬性來引用,使用十分方便。
本示例中我們使用了一個(gè)三維坐標(biāo) x,y,z 來定義一個(gè) tuple 對象,對象元素有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" 的簡稱。
deque支持線程安全、有效內(nèi)存地以近似O(1)的性能在 deque 的兩端插入和刪除元素,盡管 list 也支持相似的操作,但是它主要在固定長度操作上的優(yōu)化,從而在 pop(0) 和 insert(0,v)(會改變數(shù)據(jù)的位置和大小)上有O(n)的時(shí)間復(fù)雜度。
在數(shù)據(jù)結(jié)構(gòu)中,我們知道隊(duì)列和堆棧是兩個(gè)非常重要的數(shù)據(jù)類型,一個(gè)先進(jìn)先出,一個(gè)后進(jìn)先出。
在 python 中,使用 list 存儲數(shù)據(jù)時(shí),按索引訪問元素很快,但是插入和刪除元素就很慢,因?yàn)?list 是線性存儲,數(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) #對列表進(jìn)行了一次再處理,讓list1列表變成了雙向鏈表結(jié)構(gòu) delist.append(1000)#將x添加到deque的右側(cè) delist.appendleft(2000)#將x添加到deque的左側(cè) delist.pop(1000)#移除和返回deque中最右側(cè)的元素,如果沒有元素,將會報(bào)出IndexError; delist.popleft()#移除和返回deque中最左側(cè)的元素,如果沒有元素,將會報(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的最大長度,如果無解,就返回None delist.rotate(1)#從右側(cè)反轉(zhuǎn)n步,如果n為負(fù)數(shù),則從左側(cè)反轉(zhuǎn) delist.clear()#將deque中的元素全部刪除,最后長度為0;
(3)testDefaultdict函數(shù)
defaultdict是內(nèi)置數(shù)據(jù)類型 dict 的一個(gè)子類,基本功能與 dict 一樣,只是重寫了一個(gè)方法__missing__(key)和增加了一個(gè)可寫的對象變量 default_factory。
使用 dict 字典類型時(shí),如果引用的 key 不存在,就會拋出 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 是無序的。在對 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會按照插入的順序排列,不是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對象類似于字典,如果某個(gè)項(xiàng)缺失,會返回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()就會忽略它; list1=list(dict5.elements()) print(list1) #most_common返回一個(gè)列表,包含counter中n個(gè)最大數(shù)目的元素 #,如果忽略n或者為None,most_common()將會返回counter中的所有元素,元素有著相同數(shù)目的將會以任意順序排列; 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)微信自動回復(fù)及批量添加好友功能
這篇文章主要介紹了python實(shí)現(xiàn)微信自動回復(fù)及python 批量生成微信添加好友截圖功能的實(shí)例代碼,代碼簡單易懂,非常不錯(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)行簡繁體字轉(zhuǎn)換的案例演示
zhconv是一個(gè)Python庫,提供了簡體字和繁體字之間的轉(zhuǎn)換功能,本教程將向你展示如何使用zhconv模塊來實(shí)現(xiàn)簡繁體字的互轉(zhuǎn),并附帶一個(gè)案例演示,感興趣的朋友可以參考一下2024-05-05詳解Tensorflow數(shù)據(jù)讀取有三種方式(next_batch)
本篇文章主要介紹了Tensorflow數(shù)據(jù)讀取有三種方式(next_batch),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02python unichr函數(shù)知識點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于python unichr函數(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