這個專題,儘量使用最精簡的文字,藉助典型案例盤點Python常用的數據結構。
如果你還處於Python入門階段,通常只需掌握list、tuple、set、dict這類數據結構,做到靈活使用即可。
然而,隨著學習的深入,平時遇到實際場景變複雜,很有必要去了解Python內置的更加強大的數據結構deque、heapq、Counter、OrderedDict、defaultDict、ChainMap,掌握它們,往往能讓你少寫一些代碼且能更加高效的實現功能。
學習目標學習數據結構第一階段:掌握它們的基本用法,使用它們解決一些基本問題;
學習第二階段:知道何種場景選用哪種最恰當的數據結構,去解決題問題;
學習第三階段:了解內置數據結構的背後源碼實現,與《算法和數據結構》這門學問裡的知識聯繫起來,打通任督二脈。
下面根據定義的這三個階段,總結以下10種最常用的數據結構:
1 list基本用法 廢話不多說,在前面單獨有一個專題詳述了list的使用列表專題
使用場景 list 使用在需要查詢、修改的場景,極不擅長需要頻繁插入、刪除元素的場景。
實現原理 list對應數據結構的線性表,列表長度在初始狀態時無需指定,當插入元素超過初始長度後再啟動動態擴容,刪除時尤其位於列表開始處元素,時間複雜度為O(n)
2 tuple元組是一類不允許添加刪除元素的特殊列表,也就是一旦創建後續決不允許增加、刪除、修改。
基本用法 元組大量使用在打包和解包處,如函數有多個返回值時打包為一個元組,賦值到等號左側變量時解包。
In [22]: t=1,2,3
In [23]: type(t)
Out[23]: tuple實際創建一個元組實例
使用場景 如果非常確定你的對象後面不會被修改,則可以大膽使用元組。為什麼?因為相比於list, tuple實例更加節省內存,這點尤其重要。
In [24]: from sys import getsizeof
In [25]: getsizeof(list())
Out[25]: 72 # 一個list實例佔用72個字節
In [26]: getsizeof(tuple())
Out[26]: 56 # 一個tuple實例佔用56個字節所以創建100個實例,tuple能節省1K多字節。
3 set基本用法 set是一種裡面不能含有重複元素的數據結構,這種特性天然的使用於列表的去重。
In [27]: a=[3,2,5,2,5,3]
In [28]: set(a)
Out[28]: {2, 3, 5}除此之外,還有知道set結構可用於兩個set實例的求交集、併集、差集等操作。
In [29]: a = {2,3,5}
In [30]: b = {3,4,6,2}
In [31]: a.intersection(b) # 求交集
Out[31]: {2, 3}使用場景 如果只是想緩存某些元素值,且要求元素值不能重複時,適合選用此結構。並且set內允許增刪元素,且效率很高。
實現原理 set在內部將值哈希為索引,然後按照索引去獲取數據,因此刪除、增加、查詢元素效果都很高。
4 dict基本用法 dict 是Python中使用最頻繁的數據結構之一,字典創建由通過dict函數、{}寫法、字典生成式等,增刪查元素效率都很高。
d = {'a':1,'b':2} # {}創建字典
# 列表生成式
In [38]: d = {a:b for a,b in zip(['a','b'],[1,2])}
In [39]: d
Out[39]: {'a': 1, 'b': 2}使用場景 字典尤其適合在查詢多的場景,時間複雜度為O(1). 如leetcode第一題求解兩數之和時,就會使用到dict的O(1)查詢時間複雜度。
同時,Python類中屬性值等信息也都是緩存在__dict__這個字典型數據結構中。
但是值得注意,dict佔用字節數是list、tuple的3、4倍,因此對內存要求苛刻的場景要慎重考慮。
In [40]: getsizeof(dict())
Out[40]: 248實現原理 字典是一種哈希表,同時保存了鍵值對。
以上4種數據結構相信大家都已經比較熟悉,因此我言簡意賅的介紹一遍。接下來再詳細的介紹下面6種數據結構及各自使用場景,會列舉更多的例子。
5 deque6 Counter7 OrderedDict8 heapq9 defaultdict10 ChainMap雖然每天下班回來很累了,我依然要求自己儘量別到處轉載、到處去網上找熱點。
為什麼呢?
一是近三年來養成的總結習慣依然驅動我去多寫原創;
二來個人認為:原創代表一種態度、一種真誠,一種對初心的堅守。
當然最後也是最重要的,還有大家的期待和等候,如果你們再多多支持原創,整個三連就更好了,這是對我的一個最積極的反饋。
獲取一折本站知識星球優惠券,複製連結直接打開:
https://t.zsxq.com/662nyZF
本站qq群1003271085。
加入微信群請掃碼進群(如果是博士或者準備讀博士請說明):