數據結構聽起來是一個非常直截了當的話題,但許多數據科學和分析的新手并不知道它是什麼。當我詢問這些人關于Python中不同的數據結構以及它們是如何工作的時,他們一片空白。
Python是一種很容易學習的編程語言,但是我們需要先弄清楚我們的基本知識,然後再深入研究有吸引力的機器學習。這是因為在我們執行的每一個數據探索任務背後,甚至在我們采取的分析步驟背後,都有一個數據存儲和組織的基本元素。
而且這是一個無需考慮的問題——當我們高效地存儲數據時,提取信息變得非常容易。由于我們的代碼運行得更快,我們節省了大量的時間——誰不希望這樣呢?
所以我希望你掌握Python中的數據結構。
在本文中,我們将探讨Python中的基本内置數據結構,當你在現實世界中處理數據時,這些結構将非常有用。所以無論你是數據科學家還是分析師,這篇文章對你來說都同樣重要。
數據結構是高效存儲和組織數據的一種方法。這将允許你輕松訪問和執行數據操作。
在數據結構方面,沒有一種适合所有類型的模型。你将需要以不同的方式存儲數據,以滿足一時需要。也許你想把所有類型的數據存儲在一起,或者你想要一些更快的數據搜索,或者一些隻存儲不同數據項的東西。
幸運的是,Python有許多内置的數據結構,可以幫助我們輕松地組織數據。因此,有必要先了解這些,以便我們在處理數據時,确切地知道哪些數據結構将有效地解決我們的目的。
Python中的列表是最通用的數據結構。它們用于存儲異構數據項,從整數到字符串,甚至是另一個列表!它們也是可變的,這意味着即使在創建列表之後,它們的元素也可以更改。
列表是通過将元素括在[]内創建的,每個項用逗号分隔:
由于列表中的每個元素都有自己不同的位置,因此在列表中具有重複的值不是問題:
要訪問列表的元素,我們使用索引。列表中的每個元素都有一個與其相關的索引,這取決于它在列表中的位置。列表的第一個元素有索引0,下一個元素有索引1,依此類推。列表的最後一個元素的索引小于列表的長度。
但索引不一定總是正的,也可能是負的。你認為負索引意味着什麼?
正索引從列表開始開始計數,而負索引從列表末尾開始計數。如果我們想從列表的末尾返回第n個元素,這就避免了我們必須執行的瑣碎計算。因此,對于列表的最後一項,我們不需要返回List_name[len(List_name)-1] 元素,隻需編寫List_name[-1]。
使用負索引,我們可以輕松地返回列表末尾的第n個元素。如果我們想從結尾返回第一個元素,或者最後一個索引,那麼關聯的索引是-1。類似地,倒數第二個元素的索引将是-2,依此類推。記住,第0個索引仍然引用列表中的第一個元素。
但是如果我們想返回列表中兩個位置之間的一系列元素呢?這叫做切片。我們要做的就是指定開始和結束索引,例如List_name[start : end]。
這裡要記住的一件重要的事情是,結束索引處的元素永遠不包含在内。隻返回從開start索引到等于end-1索引的元素。
我們可以使用append()或 insert() 方法向現有列表中添加新元素:
從列表中删除元素與添加元素一樣簡單,可以使用remove()或pop()方法完成:
大多數情況下,你将使用列表對元素進行排序。因此了解sort()方法非常重要。它允許你按升序或降序對列表元素進行就地排序:
但是當你想要對包含字符串元素的列表進行排序時,事情就變得有點棘手了。你如何比較兩個字符串?好吧,字符串值是使用字符串中字符的ASCII值排序的。字符串中的每個字符都有一個與其關聯的整數值。我們使用這些值對字符串進行排序。
在比較兩個字符串時,我們隻是從一開始比較每個字符的整數值。如果在兩個字符串中遇到相同的字符,我們隻需比較下一個字符,直到找到兩個不同的字符。當然,這是内部完成的,所以你不必擔心!
我們甚至可以通過簡單地使用 符号連接兩個或多個列表。這将返回一個新列表,其中包含兩個列表中的元素:
列表的一個非常有趣的應用是列表解析,它提供了一種創建新列表的簡潔方法。這些新列表是通過對現有列表的每個元素應用操作創建的。如果我們首先檢查一下如何使用舊的for循環來完成它:
現在,我們将看到如何使用列表理解簡潔地執行此操作:
看到區别了嗎?列表解析對于任何數據科學家來說都是一項有用的語法,因為你可以看到和編寫簡明易讀的代碼!
列表是Python中内置的數據結構。但我們可以使用它來創建用戶定義的數據結構。使用列表構建的兩種非常流行的用戶定義數據結構是棧和隊列。
棧是一個元素列表,其中元素的添加或删除是從列表的末尾開始的。把它想象成一堆書。當你需要從書堆中添加或删除一本書時,你可以從頂部開始。它使用了後進先出的簡單概念。
另一方面,隊列是一個元素列表,其中元素的添加發生在列表的末尾,而元素的删除則發生在列表的前面。你可以把它想象成現實世界中的一個隊列。當前面的人離開隊列時,隊列變短。當有新成員從末尾添加到隊列中時,隊列将變長。它使用先進先出的概念。
現在,作為一個數據科學家或分析師,你可能不是每天都在使用這個概念,但是當你必須構建自己的算法時,它肯定會幫助你!
元組是Python中另一種非常流行的内置數據結構。它們與列表非常相似,隻不過有一個區别,它們是不可變的。這意味着一旦生成元組,就不能添加、删除或編輯任何值。
我們将進一步探讨這個問題,但首先讓我們看看如何在Python中創建元組!
元組可以通過在(括号)内寫入值來生成,每個元素用逗号分隔。但是,即使你寫了一堆沒有任何括号的值并把它們賦給一個變量,你最終還是會得到一個元組!
好了,現在我們知道了如何創建元組,讓我們讨論一下不變性。
在Python中,任何在創建後不能修改的内容都是不可變的。Python語言可以分解為可變和不可變的對象。
列表、字典、集合(我們将在後面的章節中探讨這些)是可變對象,這意味着它們可以在創建後修改。另一方面,整數、浮點數、布爾值、字符串甚至元組都是不可變的對象。但是,是什麼使它們不可改變呢?
Python中的所有内容都是一個對象。所以我們可以使用内置的id()方法來檢查對象的内存位置。這被稱為對象的标識。讓我們創建一個列表并确定列表及其元素的位置:
如你所見,列表及其元素在内存中都有不同的位置。因為我們知道列表是可變的,所以我們可以改變其元素的值。讓我們這樣做,看看它如何影響:
列表的位置沒有改變,但元素的位置改變了。這意味着為元素創建了一個新對象并保存在列表中。這就是可變的意思。可變對象可以在創建後更改其狀态或内容,但不可變對象不能這樣做。
但是我們可以調用元組僞不可變,因為即使它們是不可變的,它們也可以包含其值可以修改的可變對象!
從上面的示例中可以看到,我們能夠更改元組中包含的不可變對象list的值。
元組打包和解包是一些有用的操作,你可以執行這些操作來将值賦給單行中另一個元組。
當我們制造元組時,我們已經看到了元組的打包。元組解包與打包相反。
它對于在一行中交換值非常有用。老實說,這是讓我對Python感到興奮的第一件事,能夠用這麼少的代碼做這麼多事情!
雖然我說過元組值不能更改,但實際上可以通過使用list()将其轉換為列表來對其進行更改。完成更改後,可以再次使用tuple()将其轉換回元組。
然而,這種更改非常昂貴,因為它需要複制元組。但是,當你不希望其他人更改數據結構的内容時,元組就派上了用場。
Dictionary是另一種Python數據結構,用于存儲不可變但無序的異構對象。這意味着當你試圖訪問這些元素時,它們的順序可能與你插入它們的順序不完全相同。
但是,使詞典與列表區别開來的是元素在其中的存儲方式。字典中的元素是通過它們的鍵值而不是它們的索引來訪問的,正如我們在列表中所做的那樣。所以字典包含鍵值對,而不僅僅是單個元素。
字典是通過{}括号内寫入鍵和值生成的。每個鍵值對用逗号分隔:
使用鍵,我們可以輕松提取關聯值:
這些鍵是獨一無二的。但是,即使字典中有多個項具有相同的鍵,項的值為最後一個鍵關聯的值:
字典對于快速訪問項非常有用,因為與列表和元組不同,字典不必遍曆所有找到值的項。字典使用哈希提高性能。
你可以使用 keys() 方法從字典訪問鍵,使用values()方法訪問值。我們可以使用for循環查看它們,也可以使用list()将它們轉換為列表:
我們甚至可以使用items()方法同時訪問這些值,該方法返回字典中每個元素的相應鍵值對。
有時不希望在列表或元組中多次出現同一個元素。在這裡,你可以使用集合數據結構。Set是一個無序但可變的元素集合,它隻包含唯一的值。
你将看到這些值的順序與在集合中輸入的順序不同。這是因為集合是無序的。
要向集合中添加值,請使用add()方法。它允許你添加除可變對象以外的任何值:
要從集合中移除值,有兩個選項可供選擇:
如果該值不存在,remove()将給出一個錯誤,而discard() 則不會。
使用Python集,你可以執行兩個集之間的并集、交集和差集等操作,就像在數學中一樣。
兩個集合的并集給出兩個集合的值。但這些值是獨一無二的。因此,如果兩個集合包含相同的值,則隻返回一個副本:
兩個集合的交集隻返回兩個集合共有的值:
一個集合與另一個集合的差集隻給出第一個集合中不存在的值:
Python是一種漂亮的語言。它為你提供了許多選項來更有效地處理數據。學習Python中的數據結構是你學習過程中的一個關鍵。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!