學好Python,必須熟練掌握的幾種數據結構【文末送書】

2021-02-20 小數志

偉大先輩尼古拉斯·沃斯曾這樣說過:程序=數據結構+算法,這在程式設計師界堪稱經典的公式,其意義不亞於物理學界中的E=mc2。實際上,其意在闡明編程的核心在於掌握數據結構與算法!如果把一名優秀的程式設計師比作武林高手,那麼數據結構即為招式,算法則是內功,二者缺一不可。當下,Python語言非常火熱,學好Python就必須掌握好這些數據結構的常用用法。

python提供了多種數據結構可供選擇,除了全局的列表、字典、集合和元組4個基本類型外,collections模塊提供了一些定製化的數據結構集合類數據結構,array和heapq模塊則分別提供了數組和堆數據結構,本文就這4種類型加以分別介紹。

本文所指數據結構特指容器類數據結構,不包含int、str、boolean等單數據類型。

python全局內置的容器類數據結構主要有4種:分別是列表(list)、字典(dict)、集合(set)和元組(tuple),這個排名先後順序也基本代表了使用頻率,尤其是列表和字典,堪稱是python中的萬能數據結構,其簡單而強大的接口、靈活多變的推導式用法,註定了二者可以滿足大部分場景使用需求。其中:

list的最大特點是支持多種類型的元素(包括嵌套其他數據結構),且支持靈活的切片操作,再輔以強大的列表推導式,必須熟練掌握;

dict的最大特點是以鍵值對形式保存數據,提供了O(1)複雜度的查找和插入操作,在某些要求計算效率的場景下尤為好用;

set某種程度上可看做是僅有key的dict結構,其底層也是哈希實現,元素間具有無序特性。最為便捷的是,set提供了數學意義上的集合操作,例如交、並、補和差集等,這在某些場景下頗為奏效;

tuple在python中是略顯雞肋的一種數據結構,與list的唯一區別在於tuple是不可變類型,所以不支持元素的插入、更改和刪除操作。當然,某些場景下,tuple的不可變特性也具有一些好的用法,例如防止對只讀數據的誤編輯、作為字典的key(list因其可變性,所以不能作為字典的key)

更為完整的4種通用數據結構可以參考歷史文章:Simple is better than complex——python中4大數據結構常用接口簡介!

在掌握了內置的4大通用數據結構之後,如果習慣於刷LeetCode等平臺的算法題,那麼就一定會用到collections模塊,這堪稱是一個裝B炫酷的神技。

在collections內置的9種數據結構中,個人使用最為頻繁的當屬其中的3種,分別是:

Counter,計數器。繼承自dict數據結構,接收一個可迭代對象或字典類型,統計所有元素及其出現的次數,且統計元素保留迭代對象中元素出現的先後順序,並將元素及其計數值存儲為key:value值。這裡,計數可以是任何整數值,包括0和負數。常用的結果處理方法包括:most_common(),統計出現次數最多的元素及次數、結果集合的加減交並等操作,其中most_common是最為常用的方法;

defaultdict:默認字典。也是繼承自dict數據結構,與通用dict的最大區別在於默認字典的value自帶初始化數據類型,例如defaultdict(int)表示默認value為整數0的字典結構,defaultdict(list)則表示默認value為列表的字典結構,雖說只是增加了一個初始化的操作,但卻節省了待查找key值是否存在及相應初始化操作,還是非常方便的;

deque:雙端隊列。學習數據結構中必然會涉及到棧和隊列,其中棧意味著後入先出,而隊列則是先入先出,二者分別在某些場景下有著非常高效的操作。由於棧的實現完全可由普通列表實現,而隊列則不然(用列表簡單實現隊列時並不能保證O(1)的入列和出列)。實際上,deque是一個基於鍊表實現的雙端隊列,並且提供了與普通列表高度相近的方法名,例如pop(),popleft(),append(),appendleft(),extend()和extendleft(),由名字即可聯想其使用。但其一個缺點是不支持切片,畢竟是底層基於鍊表實現的數據結構。在廣度優先遍歷算法中,個人習慣使用deque。

關於這3種好用的數據結構,更為詳盡的使用和實戰詳見Python的內置容器不止有list/dict/set/tuple!

在其他語言中,array基本上是非常常用的數據結構,但由於python語言的動態特性,不同數據類型也可以混搭,所以list這種萬金油般的存在便佔盡了風頭。但也不得不承認的一個事實是,list數據結構效率並不高。為此,當list中所有數據類型一致時,尤其是全為數值型元素時,選用array實際上是更為明智的選擇。

python提供了專用的array模塊,該模塊提供了array方法,接收一個數據類型和一個可迭代對象完成初始化操作。實際上,array的方法接口幾乎沿用了列表的接口思想,包括元素的增加和減少,甚至函數名稱都較為相近,例如都有切片操作和append/pop/remove接口等。其與list的主要區別在於:

array 和list均為序列類型,佔用連續內存空間,但array更為緊湊,且所有元素類型必須相同;

list支持嵌套複雜數據結構,而array不支持。實際上,array支持的類型字符包括b, B, u, h, H, i, I, l, L, q, Q, f or d

list接口更為豐富,操作方法更為靈活(包括列表推導式),但array操作效率更高

然而,論操作簡便其不如list,論功能強大則又輸於numpy,實際上個人除了學習一下array之外,真的就沒再用過了……

一般而言,學過數據結構之後總要學些算法,而在眾多算法之中,排序可謂是最為基礎卻又相當經典的算法場景之一。而在學習排序算法時,總會遇到一種叫做堆排序的算法,其理想情況下可以實現與歸併排序、快速排序相同的算法複雜度——O(nlogn),主要得益於其特定的數據結構:堆。具體又分為大頂堆和小頂堆,其實本質是一樣的。

雖然長的像棵樹,但堆的底層其實就是一個數組。

拋卻堆的具體實現不說,堆的應用場景其實也是較為受限的,最為擅長的當屬尋找TOPK,當K=1時則可循環實現排序的過程,具體可參考歷史文章python排序算法。所以這也註定了堆數據結構中最為常用的方法包括:

最後,感謝北京大學出版社贊助,送書《數據結構與算法基礎Python語言實現》1本:

通過本書,你將全面系統的掌握常用數據結構類型及Python實現、經典算法原理,對於Python初學者來說十分有用!

送書規則:截至周六12月19日上午10:00,公眾號後臺查看閱讀最多分享最多前3名中挑選一名幸運讀者,屆時會通過截圖公布結果並添加微信聯繫。註:限於公眾號當前體量,送書數量有限,但只要稍微刷一刷歷史文章的閱讀和轉發,就可輕鬆上榜TOP3。送書活動後續將持續進行,敬請多多分享在看點讚

相關閱讀:

相關焦點

  • 必須掌握的四種python數據結構,五分鐘快速掌握
    01什麼是數據結構?數據結構是相互之間存在一種或多種特定關係的數據元素的集合今天要講python的四個內置數據結構:分別是列表、元組、集合和字典,每種結構數據都有自己的特點,應用於不同情況1、請說下四種數據結構的特點?
  • 如果想成為python全棧工程師,那就必須掌握這幾種知識!
    就web開發方向而言需要學習的內容:前端知識 包括HTML5 CSS3 JS Jquery Ajax,後端至少需要能夠熟練使用 Django和tornado 當然會flask更好Python全棧工程師是比較受歡迎的一類人才,本身Python語言具備全端開發的能力,所以Python的全棧工程師也比較多。
  • 【小白指南】Python中有哪些數據類型?(附推文合集)
    對於初學者來說,看到這裡可能還是一臉懵逼,接下來,貼心的小編就來帶大家簡單梳理一下相關的基本內容~在Python中,共有如下六種基本數據類型:不可變數據可變數據數字(Number)、字符串(String)、元祖(Tuple)列表(List)、字典(Dictionary)、集合(Set)下面依次進行簡單介紹:數字Python中包含的數字類型有如下幾種:
  • 怎麼才能學好數據結構
    最近總有我身邊的朋友在討論數據結構,對數據結構的學習了解對於我們程序猿的成長也是個很重要的關鍵,那麼數據結構到底是什麼呢?數據結構在我們的程序代碼中是不可缺少的「靈魂」,怎麼說呢,它相比於之前肉眼看得見的代碼來說,有點趨於抽象化,或許就是因為這一點,讓很多人都覺得數據結構有些難懂。在程序代碼中,運用「高質量」的數據結構模型,會使代碼更加簡潔明了,又方便後序的修改和完善。
  • C++機器學習庫介紹 | 文末送書
    C++是我學習過的第一種程式語言,我喜歡在機器學習中使用它。我在之前寫過關於構建機器學習模型的文章,我收到了一個回復,問我C++有沒有機器學習的庫?這是個很好的問題。像Python和R這樣的語言有大量的包和庫來滿足不同的機器學習任務,那麼C++有沒有這樣的產品呢?是的!在本文中,我將重點介紹兩個這樣的C++庫,我們也將看到它們都是可以運行。
  • 如何快速學會Python處理數據?(5000字走心總結)
    很多同學抱怨自己很想學好Python,但學了好久,書也買不少,視頻課程也看了不少,但是總是學了一段時間,感覺還是沒什麼收穫,碰到問題沒思路,有思路寫不出多少行代碼,遇到報錯時也不知道怎麼處理。從入門到放棄,這是很多學習python的同學常常掛在嘴邊上的口頭禪。
  • 學好Python,能找到什麼工作?工資多少?
    3.大數據我們目前正處於大數據時代,Python這門語言在大數據上比Java更加有效率,Python可以更快地提升對數據抓取的精準程度和速度,這對於做數據分析的人來說再好不過了4.Linux運維Linux運維是必須而且一定要掌握Python語言,問問中國的每個運維人員,運維人員必須會的語言是什麼?10個人相信會給你一個相同的答案,它的名字叫Python。
  • 牛逼的Python書,你看過幾本?
    python書給大家,大家可以找一兩本修煉,定能讓你的功力大增.(我不是給作者打廣告,而是良心推薦)2.Python核心編程核心編程可以說一本大寶典大寶庫,把python的方方面面都包含在裡面的,非常不錯,很少有python的書講的這麼全面.書雖然叫核心編程,但是也是適合初學者閱讀,作者非常貼心的把Python分成兩大部分:第一部分: 是一些基本的語法和重要的知識點
  • 《Python程式設計師面試算法寶典》PDF超清版開源了文末附下載方式
    後10章分別從基礎數據類型、數組和字符串、鍊表、堆棧、二叉樹、堆、二分查找法、圖論、貪婪算法和動態規劃等多個方面去詳解各類面試題,分析算法面試中常見的各類技術問題。通過本書的學習,希望讀者能夠在大腦中建立起自己的解決方案資料庫,面試時可以迅速地搜索出相應的解決方案,從而提高解題效率和增加通過面試的機率。
  • 學python?不是一個python入門教程就行,學之前你必須知道這些
    第一 學習方向:python應用方向很多,必須明確學習方向想全棧開發:就是web應用開發,是用來寫網站後臺的數據分析:看重前景方向:那麼學python大數據分析或是python機器學習。其中大數據分析相對容易,python提供的是語言的環境,數據分析會有許多對應的工具包,會包含各種分析模型,隨著經驗積累會很熟練照到對應項目的分析模型。
  • 每個程式設計師都必須知道的8種數據結構
    來源 | Python之禪http://suo.im/6oo92L快速介紹8種常用數據結構
  • 小白學 Python(12):基礎數據結構(字典)(上)
    人生苦短,我選Python前文傳送門小白學 Python(1):開篇小白學 Python(2):基礎數據類型(上)小白學 Python(3):基礎數據類型(下)小白學 Python(4):變量基礎操作小白學 Python(5):基礎運算符(上)小白學 Python(6):基礎運算符(下)小白學 Python(7):基礎流程控制(上)小白學 Python(8):基礎流程控制(下)小白學 Python(9):基礎數據結構(列表)(上)小白學 Python(10):
  • Python零基礎好學嗎?
    如果你真正想把語言學好,那麼先想想為什麼要學語言,找一份工作,還是為了解決某個繁瑣問題,抑或是做個網站給自己用,還是寫個App,或者搞個爬蟲做數據分析,最怕的就是不知道為什麼而學,就算是為了擺脫焦慮而學習你也很難學好。
  • 一日一技:python中4大數據結構常用接口簡介
    具體到python中數據結構的選擇運用,雖然有很多類型可供選擇:除了基本的列表、字典、集合和元組4個基本類型外,collections模塊中提供了很多定製化的數據結構,還有專用的堆heapq和枚舉enum等。誠然,特定數據結構在某些應用場景下可能有神奇的效果,但把基礎數據類型用到極致也可堪稱是絕招。
  • 為什麼要學數據結構?| 原力計劃
    很多人認為,只要掌握幾種開發工具就可以成為編程高手,其實,這是一種誤解。要想成為一個專業的開發人員,至少需要以下三個條件:1) 能夠熟練地選擇和設計各種數據結構和算法2) 至少要能夠熟練地掌握一門程序設計語言3) 熟知所涉及的相關應用領域的知識其中,後兩個條件比較容易實現,而第一個條件則需要花相當的時間和精力才能夠達到,它是區分一個程序設計人員水平高低的一個 重要標誌,數據結構 貫穿程序設計的始終 ,缺乏數據結構和算法的深厚功底
  • python高級用法,自定義數據結構,我猜你一定沒使用過
    文/IT可達鴨圖/IT可達鴨、網絡前言每個學習python的人都會對這些原生的數據結構有一定的了解,python底層給我們提供了多種多樣的原生數據結構,例如:list同樣的,原生數據結構所定義的基本方法,也是大家所熟悉的,例如:len()、str()、int()等等。當然還有,我們最最熟悉的比較操作符,例如:>=、==、<=等等。還有運算操作符、容器操作等等。魔術方法我現在告訴你,其實上面這些原生數據結構、操作符、運算符都可以自定義,而且非常簡單。
  • 行哥Python書單推薦及送書計劃1.0
    感謝大家對行哥的支持,行哥的希望各位讀者在一行數據都能獲得點知識和成長,或者讓行哥直接送書來幫助你好了。例如前天晚上行哥朋友圈推薦的1元課程,也是自己報過名的課程覺得非常良心來推薦給大家,行哥還直接幫你交學費香不香(畢竟只要1塊錢哈哈)今天行哥來系統的從Python各個學習方向給大家推薦書單,文末再送上未來每周的送書計劃首先對於各位初學Python的小白來說
  • JAVA必須掌握的數據結構和算法
    常見的數據結構鍊表LinkedHashSet LinkedList 底層數據結構由鍊表和哈希表組成。數據的添加和刪除都較為方便,就是訪問比較耗費時間。數組ArrayList 訪問數據十分簡單,而添加和刪除數據比較耗工夫堆堆是一種圖的樹形結構,被用於實現「優先隊列",優先隊列是一種數據結構,可以自由添加數據,但取出數據時要從最小值開始按順序取出
  • Python基石 | Python中的數據結構詳解
    這是因為在我們執行的每一個數據探索任務背後,甚至我們採取的分析步驟背後,都有一個數據存儲和組織的基本元素。而且這是一個無需考慮的問題——當我們高效地存儲數據時,提取信息會變得非常容易,由於我們的代碼運行得更快,我們節省了大量的時間——誰不希望這樣呢?所以我希望你掌握Python中的數據結構。
  • 送126本Python書,已全部打包好!
    本次送書由異步社區出版社贊助,贈書為以下 13 種。本書講解了如何使用Python來編寫網絡爬蟲程序,內容包括網絡爬蟲簡介,從頁面中抓取數據的3種方法,提取緩存中的數據,使用多個線程和進程進行並發抓取,抓取動態頁面中的內容,與表單進行交互,處理頁面中的驗證碼問題,以及使用Scarpy和Portia進行數據抓取,並在最後介紹了使用本書講解的數據。