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