python內(nèi)置數(shù)據(jù)結(jié)構(gòu)包括列表、字典、集合,樹和圖需手動實現(xiàn)或借助庫。1. 列表是動態(tài)數(shù)組,適合順序和隨機訪問,但頻繁在頭部插入元素建議用collections.deque;2. 字典基于哈希表,平均時間復雜度為o(1),支持鍵值對存儲,可保持插入順序;3. 集合用于去重和集合運算,判斷元素是否存在效率高;4. 樹和圖需自定義類或使用第三方庫如networkx實現(xiàn),常見遍歷方式有深度優(yōu)先和廣度優(yōu)先。掌握這些結(jié)構(gòu)的實現(xiàn)有助于提升代碼效率。
python 作為一門高級編程語言,內(nèi)置了很多常用的數(shù)據(jù)結(jié)構(gòu),并且支持靈活的自定義實現(xiàn)。掌握這些數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)方式,對理解算法、提升代碼效率很有幫助。
列表(List):動態(tài)數(shù)組的實現(xiàn)
Python 的列表是動態(tài)數(shù)組的一種實現(xiàn),可以自動擴容。它在內(nèi)存中是連續(xù)存儲的,所以訪問元素很快,時間復雜度為 O(1)。但插入和刪除操作可能需要移動大量元素,最壞情況下時間復雜度為 O(n)。
- 如果你在頻繁地往列表頭部插入元素,建議考慮使用 collections.deque。
- 使用列表模擬棧(stack)時,用 append() 和 pop() 效率很高。
- 模擬隊列(queue)時,用 pop(0) 性能較差,推薦用雙端隊列 deque.popleft()。
列表非常適合順序訪問和隨機訪問,但在頻繁修改中間或開頭位置時性能一般。
立即學習“Python免費學習筆記(深入)”;
字典(Dict):哈希表的實現(xiàn)
字典是基于哈希表實現(xiàn)的,鍵值對存儲,查找、插入和刪除的時間復雜度平均為 O(1),非常高效。每個鍵必須是可哈希的類型,比如整數(shù)、字符串、元組等。
- 字典底層通過哈希函數(shù)計算鍵的位置,如果發(fā)生沖突(不同鍵算出同一個索引),會采用開放尋址法或鏈式存儲來解決。
- 如果你希望保持插入順序,在 Python 3.7 及以上版本中,字典默認就是有序的。
- 自定義對象作為鍵時,要確保其實現(xiàn)了 __hash__() 和 __eq__() 方法。
如果你需要一個默認值返回機制,可以用 dict.get(key, default) 或者 collections.defaultdict。
集合(Set):無序不重復集合
集合是基于哈希表實現(xiàn)的,內(nèi)部只保存鍵,沒有值。它適合用來去重或者進行集合運算(交集、并集、差集等)。
- 判斷某個元素是否在集合中,比列表快得多,平均時間復雜度是 O(1)。
- 集合本身是不可哈希的,但有不可變版本 frozenset。
- 常見操作包括:add(), remove(), union(), intersection() 等。
舉個例子:你想快速判斷兩個列表是否有共同元素,可以把它們轉(zhuǎn)成集合后求交集。
樹和圖:需要手動實現(xiàn)或借助庫
Python 標準庫并沒有直接提供樹(Tree)或圖(Graph)這類結(jié)構(gòu),通常需要自己構(gòu)建類或者使用第三方庫如 networkx。
- 實現(xiàn)二叉樹時,通常定義節(jié)點類,包含值、左子節(jié)點和右子節(jié)點。
- 圖可以用鄰接表(字典+列表)或鄰接矩陣(二維數(shù)組)表示。
- 常見遍歷方式:深度優(yōu)先(DFS)、廣度優(yōu)先(BFS)。
例如,用字典表示圖:
graph = { 'A': ['B', 'C'], 'B': ['A', 'D'], 'C': ['A', 'E'], 'D': ['B'], 'E': ['C'] }
這種結(jié)構(gòu)清晰又容易操作,適合處理圖相關的搜索和路徑問題。
基本上就這些。Python 提供了很豐富的基礎數(shù)據(jù)結(jié)構(gòu),同時也很靈活,可以根據(jù)需要擴展實現(xiàn)更復雜的結(jié)構(gòu)。了解它們的底層實現(xiàn)方式,有助于寫出更高效的代碼。