摘要:它需要一個(gè)函數(shù)默認(rèn)工廠作為其參數(shù)。默認(rèn)情況下設(shè)置為,即如果鍵不存在則為,并返回并顯示默認(rèn)值。因此,它是一個(gè)無(wú)序集合,其中元素及其各自的計(jì)數(shù)存儲(chǔ)為字典。這相當(dāng)于其他語(yǔ)言的或。使用,我們不必使用整數(shù)索引來(lái)訪問(wèn)元組的成員。
神奇的collections
大家好,今天想和大家分享一個(gè)Python里面非常棒的??欤?strong>Collections
該模塊實(shí)現(xiàn)了專門的容器數(shù)據(jù)類型,為Python的通用內(nèi)置容器提供了替代方案,如果對(duì)源碼感興趣的朋友們可以在 Lib/collections/__init__.py 路徑下找到
基于我目前的學(xué)習(xí)經(jīng)驗(yàn),以下幾種類型用的很多:
defaultdict (dict子類調(diào)用工廠函數(shù)來(lái)提供缺失值)
counter (用于計(jì)算可哈希對(duì)象的dict子類)
deque (類似于列表的容器,可以從兩端操作)
namedtuple (用于創(chuàng)建具有命名字段的tuple子類的工廠函數(shù))
OrderedDict (記錄輸入順序的dict)
好啦,看到什么工廠函數(shù),可哈希對(duì)象,容器這些詞匯不要慌,我第一次看是懵逼并直接跳過(guò)的,然而后來(lái)發(fā)現(xiàn)根本不需要理解,如果大家感興趣可以自己去查詢,這里還是老樣子,通過(guò)大量實(shí)例來(lái)一個(gè)個(gè)講解!
defaultdict基礎(chǔ)概念
“defaultdict”是在名為“collections”的模塊中定義的容器。它需要一個(gè)函數(shù)(默認(rèn)工廠)作為其參數(shù)。默認(rèn)情況下設(shè)置為“int”,即0.如果鍵不存在則為defaultdict,并返回并顯示默認(rèn)值。
我用人話解釋一下: 其實(shí)就是一個(gè)查不到key值時(shí)不會(huì)報(bào)錯(cuò)的dict
應(yīng)用實(shí)例
首先我們來(lái)看一個(gè)用正常dict的例子,如果我們創(chuàng)建了一個(gè)叫person的字典,里面存儲(chǔ)的key值為name,age,如果這時(shí)候嘗試調(diào)用person["city"],會(huì)拋出KeyError錯(cuò)誤,因?yàn)闆](méi)有city這個(gè)鍵值:
person = {"name":"xiaobai","age":18} print ("The value of key "name" is : ",person["name"]) print ("The value of key "city" is : ",person["city"]) Out: The value of key "name" is : xiaobai Traceback (most recent call last): File "C:UsersE560Desktop est.py", line 17, inprint ("The value of key "city" is : ",person["city"]) KeyError: "city"
現(xiàn)在如果我們用defaultdict再試試呢?
from collections import defaultdict person = defaultdict(lambda : "Key Not found") # 初始默認(rèn)所有key對(duì)應(yīng)的value均為‘Key Not Found’ person["name"] = "xiaobai" person["age"] = 18 print ("The value of key "name" is : ",person["name"]) print ("The value of key "adress" is : ",person["city"]) Out:The value of key "name" is : xiaobai The value of key "adress" is : Key Not found
大家可以發(fā)現(xiàn),這次沒(méi)有問(wèn)題了,其實(shí)最根本的原因在于當(dāng)我們創(chuàng)建defaultdict時(shí),首先傳遞的參數(shù)是所有key的默認(rèn)value值,之后我們添加name,age進(jìn)去的時(shí)候才會(huì)有所改變,當(dāng)我們最終查詢時(shí),如果key存在,那就輸出對(duì)應(yīng)的value值,如果不存在,就會(huì)輸出我們事先規(guī)定好的值‘Key Not Found’
除此之外外,我們還可以利用defaultdict創(chuàng)建時(shí),傳遞參數(shù)為所有key默認(rèn)value值這一特性,實(shí)現(xiàn)一些其他的功能,比如:
from collections import defaultdict d = defaultdict(list) d["person"].append("xiaobai") d["city"].append("paris") d["person"].append("student") for i in d.items(): print(i) Out: ("person", ["xiaobai", "student"]) ("city", ["paris"])
一個(gè)道理,我們默認(rèn)所有key對(duì)應(yīng)的是一個(gè)list,自然就可以在賦值時(shí)使用list的append方法了。再比如下面這個(gè)例子:
from collections import defaultdict food = ( ("jack", "milk"), ("Ann", "fruits"), ("Arham", "ham"), ("Ann", "soda"), ("jack", "dumplings"), ("Ahmed", "fried chicken"), ) favourite_food = defaultdict(list) for n, f in food: favourite_food[n].append(f) print(favourite_food) Out:defaultdict(, {"jack": ["milk", "dumplings"], "Ann": ["fruits", "soda"], "Arham": ["ham"], "Ahmed": ["fried chicken"]})
道理和上面差不多,這里大家可以自己拓展,展開想象,相信可能在某個(gè)時(shí)刻可以用的上defaultdict這個(gè)容器
counter基礎(chǔ)概念
Counter是dict的子類。因此,它是一個(gè)無(wú)序集合,其中元素及其各自的計(jì)數(shù)存儲(chǔ)為字典。這相當(dāng)于其他語(yǔ)言的bag或multiset。
我的理解就是一個(gè)計(jì)數(shù)器,返回一個(gè)字典,key就是出現(xiàn)的元素,value就是該元素出現(xiàn)的次數(shù)
應(yīng)用實(shí)例
計(jì)數(shù)器沒(méi)啥可說(shuō)的,還能干啥,計(jì)數(shù)唄!
from collections import Counter count_list = Counter(["B","B","A","B","C","A","B","B","A","C"]) #計(jì)數(shù)list print (count_list) count_tuple = Counter((2,2,2,3,1,3,1,1,1)) #計(jì)數(shù)tuple print(count_tuple) Out:Counter({"B": 5, "A": 3, "C": 2}) Counter({1: 4, 2: 3, 3: 2})
Counter一般不會(huì)用于dict和set的計(jì)數(shù),因?yàn)閐ict的key是唯一的,而set本身就不能有重復(fù)元素
現(xiàn)在我們也可以直接把在defaultdict例子中用過(guò)food元組拿來(lái)計(jì)數(shù):
from collections import Counter food = ( ("jack", "milk"), ("Ann", "fruits"), ("Arham", "ham"), ("Ann", "soda"), ("jack", "dumplings"), ("Ahmed", "fried chicken"), ) favourite_food_count = Counter(n for n,f in food) #統(tǒng)計(jì)name出現(xiàn)的次數(shù) print(favourite_food_count) Out: Counter({"jack": 2, "Ann": 2, "Arham": 1, "Ahmed": 1})deque
基礎(chǔ)概念
在我們需要在容器兩端的更快的添加和移除元素的情況下,可以使用deque.
我的個(gè)人理解是deque就是一個(gè)可以兩頭操作的容器,類似list但比列表速度更快
應(yīng)用實(shí)例
deque的方法有很多,很多操作和list類似,也支持切片
from collections import deque d = deque() d.append(1) d.append(2) d.append(3) print(len(d)) print(d[0]) print(d[-1]) Out: 3 1 3
deque最大的特點(diǎn)在于我們可以從兩端操作:
d = deque([i for i in range(5)]) print(len(d)) # Output: 5 d.popleft() # 刪除并返回最左端的元素 # Output: 0 d.pop() # 刪除并返回最右端的元素 # Output: 4 print(d) # Output: deque([1, 2, 3]) d.append(100) # 從最右端添加元素 d.appendleft(-100) # 從最左端添加元素 print(d) # Output: deque([-100, 1, 2, 3, 100])
除了這些deque的方法實(shí)在太多了,比如我再舉幾個(gè)常用的例子,首先我們定義一個(gè)deque時(shí)可以規(guī)定它的最大長(zhǎng)度,deque和list一樣也支持extend方法,方便列表拼接,但是deque提供雙向操作:
from collections import deque d = deque([1,2,3,4,5], maxlen=9) #設(shè)置總長(zhǎng)度不變 d.extendleft([0]) # 從左端添加一個(gè)list d.extend([6,7,8]) # 從右端拓展一個(gè)list print(d) Out:deque([0, 1, 2, 3, 4, 5, 6, 7, 8], maxlen=9)
現(xiàn)在d已經(jīng)有9個(gè)元素了,而我們規(guī)定的maxlen=9,這個(gè)時(shí)候如果我們從左邊添加元素,會(huì)自動(dòng)移除最右邊的元素,反之也是一樣:
d.append(100) print(d) d.appendleft(-100) print(d) Out: deque([1, 2, 3, 4, 5, 6, 7, 8, 100], maxlen=9) deque([-100, 1, 2, 3, 4, 5, 6, 7, 8], maxlen=9)
deque還有很多其他的用法,大家根據(jù)各自的需要去自己尋寶吧!
namedtuple基礎(chǔ)概念
名稱元組。大家一看名字就會(huì)感覺和tuple元組有關(guān),沒(méi)錯(cuò),我認(rèn)為它是元組的強(qiáng)化版
namedtuple可以將元組轉(zhuǎn)換為方便的容器。使用namedtuple,我們不必使用整數(shù)索引來(lái)訪問(wèn)元組的成員。
我覺得可以把namedtuple 視為 不可變的 字典
應(yīng)用實(shí)例
首先,讓我們先回顧一下普通元組是如何訪問(wèn)成員的:
person = ("xiaobai", 18) print(person[0]) out:xiaobai
現(xiàn)在我們看看namedtuple(名稱元組)的強(qiáng)大之處:
from collections import namedtuple Person = namedtuple("Person", "name age city") # 類似于定義class xiaobai = Person(name="xiaobai", age=18, city="paris") # 類似于新建對(duì)象 print(xiaobai) Out:Person(name="xiaobai", age=18, city="paris")
我們創(chuàng)建namedtuple時(shí)非常像定義一個(gè)class,這里Person好比是類名,第二個(gè)參數(shù)就是namedtuple的值的名字了,我感覺很像class里的屬性,不過(guò)這里不用加逗號(hào)分離,下面讓我們看看如何訪問(wèn)namedtuple的成員:
print(xiaobai.name) print(xiaobai.age) print(xiaobai.city) out:xiaobai 18 paris
"爽啊,爽死了",郭德綱看到這里不禁贊嘆
這種無(wú)限接近c(diǎn)lass調(diào)用屬性的方式還是非常不錯(cuò)的,在一些實(shí)際場(chǎng)景很有用。
最后還有一點(diǎn)千萬(wàn)不要忘了,我們不能修改namedtuple里的值:
xiaobai.name = "laobai" Out:Traceback (most recent call last): File "C:UsersE560Desktop est.py", line 5, inOrderedDictxiaobai.name = "laobai" AttributeError: can"t set attribute
基礎(chǔ)概念
“OrderedDict” 本身就是一個(gè)dict,但是它的特別之處在于會(huì)記錄插入dict的key和value的順序
應(yīng)用實(shí)例
from collections import OrderedDict d = {} d["a"] = 1 d["b"] = 2 d["c"] = 3 d["d"] = 4 print(d) Out:{"a": 1, "c": 3, "b": 2, "d": 4}
大家可以看到,這是一個(gè)普通的dict,因?yàn)闊o(wú)序,即使我們依次添加了a,b,c,d 四個(gè)鍵并賦予value,但是輸出的順序并不可控。OrderedDict的出現(xiàn)就是為了解決這個(gè)問(wèn)題:
from collections import OrderedDict d = OrderedDict() d["a"] = 1 d["b"] = 2 d["c"] = 3 d["d"] = 4 print(d) Out:OrderedDict([("a", 1), ("b", 2), ("c", 3), ("d", 4)])
這回輸出時(shí)好多了,因?yàn)闀?huì)自動(dòng)記錄插入的順序,同理,如果我們刪除一個(gè)key, OrderedDict的順序不會(huì)發(fā)生變化:
from collections import OrderedDict print("Before deleting: ") od = OrderedDict() od["a"] = 1 od["b"] = 2 od["c"] = 3 od["d"] = 4 for key, value in od.items(): print(key, value) print(" After deleting: ") od.pop("c") for key, value in od.items(): print(key, value) print(" After re-inserting: ") od["c"] = 3 for key, value in od.items(): print(key, value) Out:Before deleting: ("a", 1) ("b", 2) ("c", 3) ("d", 4) After deleting: ("a", 1) ("b", 2) ("d", 4) After re-inserting: ("a", 1) ("b", 2) ("d", 4) ("c", 3)總結(jié)
今天為大家簡(jiǎn)單介紹了collections的一些基礎(chǔ)容器類型,包括:
defaultdict 不會(huì)報(bào)錯(cuò)的dict
counter 計(jì)數(shù)器
deque 雙向操作list
namedtuple 名稱元組
我覺得把它們叫做寶藏感覺還是不過(guò)分的,因?yàn)檫@些容器在真實(shí)使用場(chǎng)景中非常有用,而且我發(fā)現(xiàn)很多教程不會(huì)提到,因此衷心希望可以幫到大家,如果我哪里介紹有錯(cuò)誤或者遺漏,希望大家留言指出,讓我們一起進(jìn)步!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43182.html
摘要:將每一行作為返回,其中是每行中的列名。對(duì)于每一行,都會(huì)生成一個(gè)對(duì)象,其中包含和列中的值。它返回一個(gè)迭代器,是迭代結(jié)果都為的情況。深度解析至此全劇終。 簡(jiǎn)單實(shí)戰(zhàn) 大家好,我又來(lái)了,在經(jīng)過(guò)之前兩篇文章的介紹后相信大家對(duì)itertools的一些常見的好用的方法有了一個(gè)大致的了解,我自己在學(xué)完之后仿照別人的例子進(jìn)行了真實(shí)場(chǎng)景下的模擬練習(xí),今天和大家一起分享,有很多部分還可以優(yōu)化,希望有更好主意...
摘要:例如,以下對(duì)兩個(gè)的相應(yīng)元素求和這個(gè)例子很好的解釋了如何構(gòu)建中所謂的迭代器代數(shù)的函數(shù)的含義。為簡(jiǎn)單起見,假設(shè)輸入的長(zhǎng)度可被整除。接受兩個(gè)參數(shù)一個(gè)可迭代的正整數(shù)最終會(huì)在中個(gè)元素的所有組合的元組上產(chǎn)生一個(gè)迭代器。 前言 大家好,今天想和大家分享一下我的itertools學(xué)習(xí)體驗(yàn)及心得,itertools是一個(gè)Python的自帶庫(kù),內(nèi)含多種非常實(shí)用的方法,我簡(jiǎn)單學(xué)習(xí)了一下,發(fā)現(xiàn)可以大大提升工作...
前情回顧 大家好,我又回來(lái)了。今天我會(huì)繼續(xù)和大家分享itertools這個(gè)神奇的自帶庫(kù),首先,讓我們回顧一下上一期結(jié)尾的時(shí)候我們講到的3個(gè)方法: combinations() combinations_with_replacement() permutations() 讓我們對(duì)這3個(gè)在排列組合中經(jīng)常會(huì)使用到的函數(shù)做個(gè)總結(jié) combinations() 基礎(chǔ)概念 模板:combinations...
摘要:學(xué)習(xí)筆記七數(shù)學(xué)形態(tài)學(xué)關(guān)注的是圖像中的形狀,它提供了一些方法用于檢測(cè)形狀和改變形狀。學(xué)習(xí)筆記十一尺度不變特征變換,簡(jiǎn)稱是圖像局部特征提取的現(xiàn)代方法基于區(qū)域圖像塊的分析。本文的目的是簡(jiǎn)明扼要地說(shuō)明的編碼機(jī)制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來(lái)看這樣一個(gè)提問(wèn): pyth...
閱讀 3720·2021-09-22 15:15
閱讀 3620·2021-08-12 13:24
閱讀 1354·2019-08-30 15:53
閱讀 1865·2019-08-30 15:43
閱讀 1219·2019-08-29 17:04
閱讀 2833·2019-08-29 15:08
閱讀 1650·2019-08-29 13:13
閱讀 3131·2019-08-29 11:06