目錄字典
有序字典ordereddict
帶有預設值的字典defaultdict
counter
userdict 集合
python自帶的collections模組中為我們提供了很多字典的擴充套件功能
python中字典是無序的,所以使用內建欄位的popitem()函式的時候,會隨機刪除乙個元素並且將其返回,但是有的時候我們需要讓字典保持一定的順序,於是我們就可以使用ordereddict這個類
ordereddict會按照插入的時間進行排序,而它的popitem方法預設刪除並返回的是字典中的最後乙個元素
from collections import ordereddict
in [11]: d = ordereddict.fromkeys('abcdefghi', 0)
in [12]: d.popitem()
out[12]: ('i', 0)
in [13]: d
out[13]:
ordereddict([('a', 0),
('b', 0),
('c', 0),
('d', 0),
('e', 0),
('f', 0),
('g', 0),
('h', 0)])
在需要根據插入時間排序的地方或者有類似於棧的需求的地方都可以用到ordereddict
當字典d[k]找不到鍵的時候,python就會丟擲異常,我們可以使用d.get(k, default)來代替d[k],而另一種解決方案是使用defaultdict
import collections
in [16]: dd = collections.defaultdict(list)
in [17]: dd['1']
out[17]:
in [18]: dd
out[18]: defaultdict(list, )
首先在構造defaultdict物件的時候傳入乙個函式,上面傳入了list這個函式,當使用dd['1']時,因為'1'這個鍵並不存在,所以會執行如下步驟(1)呼叫list函式新建乙個列表(2)將作為新值,將'1'作為它的鍵(3)返回
同樣,在構造的時候也可以傳入其他返回值的函式,比如說,要建乙個預設值為2的字典
in [16]: dd = collections.defaultdict(lambda : 2)
in [17]: dd[1]
out[17]: 2
in [18]: dd
out[18]: defaultdict(at 0x000001e28bcbc268>, )
其實所有處理找不到鍵的問題的時候,都會涉及到__missing__這個特殊方法,一旦發生了找不到鍵這種問題的時候,就會去呼叫__missing__這個方法,所以我們可以使用自定義類的方式來處理找不到鍵的問題,該自定義類需要繼承dict
現在我們來自定義乙個類,現在一旦找不到鍵,那麼就不讓它丟擲異常了,我們讓它先列印乙個找不到鍵的提示,然後返回false
class mydict(dict):
def __missing__(self, key):
print("key "+str(key)+" is not found!")
return false
my_dict = mydict()
my_dict[0]
輸出結果為 :
key 0 is not found!
false
這個類可以用於統計列表中相同元素出現的次數,這個功能用到次數還是蠻多的,有統計元素個數需求的時候都可以使用它,可以想象成乙個預設值為0的字典。
import collections
in [19]: c = collections.counter()
in [20]: for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
...: c[word] += 1
...:
in [21]: c
out[21]: counter()
也可以統計字串中字元出現的頻次
in [22]: c2 = collections.counter('asasfbsagbqgenasbhfeibafuwqygq')
in [23]: c2
out[23]:
counter()
用於建立字典的子類,當我們需要建立自定義對映型別的時候,我們更傾向於從userdict繼承,因為dict在內部實現的時候會走一些捷徑,導致我們必須重寫這些方法,而userdict就不會有這樣的問題。
所以userdict本質上就是把標準的dict用純粹的python實現了一遍,專門讓使用者繼承寫子類,上面的那個__missing__的例子就可以用幾成userdict的方式改寫。
集合算是python出現較少的資料結構了,不過在某些情況下,它可以非常方便地幫助我們解決問題
s1 =
s2 =
s3 = set()
集合的寫法和數學上的寫法差不多,不過需要注意的是,如果想建立乙個空集,那麼需要寫成set(),不能寫成{},因為單純的大括號表示的是字典
在python對集合進行運算也是相當方便
s1 =
s2 =
s3 =
# 求交集∩
s1 & s2
# 求並集∪
s1 | s2
# 求差集
s1-s2
# 求對稱差
s1^s2
# 屬於∈ 某個元素是否在某個集合中 true
3 in s2
# 是否為子集⊆ true
s3 <= s2
# 是否為真子集⊂ true
s3 < s2
當然還有些基本操作
s.add(e)
新增元素e
s.clear()
清空ss.copy()
s潛複製
s.discard(e)
如果s中有e那麼就刪除e
s.pop()
移除最後乙個元素
s.remove(e)
移除e,如果e不在s中,那麼丟擲異常
應用:要是想要找兩個列表的公共元素,那麼可以先將它們轉成set,然後求交,或者找到兩個列表中不同的元素,那麼先轉成set,然後求差,set中不能出現重複元素這個特定也很好用,有時候可以直接用新增,因為set可以自行判斷元素是否重複。
python內建高階資料結構
在程式設計過程,特別是線上程式設計的過程中,總會需要用到很多高階的資料結構,但是python中的一些高階資料結構並沒有那麼的 明顯 這裡梳理一下。mystack 1 2 3 mystack out 8 1,2,3 mystack.pop out 9 3一般的佇列可能大部分人都跟我的使用差不多,還是用...
python高階學習(一)資料結構 列表
目錄前言 陣列 列表 列表推導式與高階函式 生成器表示式 當列表不夠用時 雙向佇列 元組 元組與記錄 具名元組nametuple 作為不可變列表 本篇以及接下來的篇章均為 流暢的python 學習筆記,內容主要出自該書,重點偏向於應用 這節主要展示python資料結構的特性,以及使用自帶的colle...
python資料結構(二)
棧的應用之進製轉換 我們在大一的計算機基礎甚至高中的課程都已經了解了進製,以及不同進製的轉換方法。所謂進製,就是多少進製的幾次冪,例如十進位制下的233.就是2乘以10的平方加上3乘以十的一次方再加上3乘以10的0次方,演算法 十進位制轉換為二進位制,採用的是除以二求餘數的2演算法,在除二的過程中,...