訂閱
糾錯
加入自媒體

Python基石 | Python中的數(shù)據(jù)結(jié)構(gòu)詳解

概述

在深入研究數(shù)據(jù)科學(xué)和模型構(gòu)建之前,Python中的數(shù)據(jù)結(jié)構(gòu)是一個需要學(xué)習(xí)的關(guān)鍵內(nèi)容

了解Python提供的不同數(shù)據(jù)結(jié)構(gòu),包括列表、元組等

介紹

數(shù)據(jù)結(jié)構(gòu)聽起來是一個非常直截了當(dāng)?shù)脑掝},但許多數(shù)據(jù)科學(xué)和分析的新手并不知道它是什么,當(dāng)我詢問這些人關(guān)于Python中不同的數(shù)據(jù)結(jié)構(gòu)以及它們是如何工作的時,他們一片空白。

Python是一種很容易學(xué)習(xí)的編程語言,但是我們需要先弄清楚我們的基本知識,然后再深入研究有吸引力的機(jī)器學(xué)習(xí)。這是因?yàn)樵谖覀儓?zhí)行的每一個數(shù)據(jù)探索任務(wù)背后,甚至我們采取的分析步驟背后,都有一個數(shù)據(jù)存儲和組織的基本元素。

而且這是一個無需考慮的問題——當(dāng)我們高效地存儲數(shù)據(jù)時,提取信息會變得非常容易,由于我們的代碼運(yùn)行得更快,我們節(jié)省了大量的時間——誰不希望這樣呢?

所以我希望你掌握Python中的數(shù)據(jù)結(jié)構(gòu)。

在本文中,我們將探討Python中的基本內(nèi)置數(shù)據(jù)結(jié)構(gòu),當(dāng)你在現(xiàn)實(shí)世界中處理數(shù)據(jù)時,這些結(jié)構(gòu)將非常有用。所以無論你是數(shù)據(jù)科學(xué)家還是分析師,這篇文章對你來說都同樣重要。

目錄

Python中的數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu)1:Python中的列表

創(chuàng)建列表

訪問列表元素

在列表中追加值

從列表中刪除元素

排序列表

串聯(lián)列表

列表推導(dǎo)式

使用列表堆棧和隊(duì)列

數(shù)據(jù)結(jié)構(gòu)2:Python中的元組

在Python中創(chuàng)建元組

元組的不變性

元組賦值

更改元組值

數(shù)據(jù)結(jié)構(gòu)3:Python中的字典

生成字典

訪問鍵和值

數(shù)據(jù)結(jié)構(gòu)4:Python中的集合

從集合中添加和刪除元素

集合的操作

Python中的數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu)是高效存儲和組織數(shù)據(jù)的一種方法,它允許你輕松訪問和執(zhí)行數(shù)據(jù)操作。

在數(shù)據(jù)結(jié)構(gòu)方面,沒有一種適合所有類型的模型。你將需要以不同的方式存儲數(shù)據(jù),以滿足一時需要。也許你想把所有類型的數(shù)據(jù)存儲在一起,或者你想要一些更快的數(shù)據(jù)搜索,或者一些只存儲不同數(shù)據(jù)項(xiàng)的東西。

幸運(yùn)的是,Python有許多內(nèi)置的數(shù)據(jù)結(jié)構(gòu),可以幫助我們輕松地組織數(shù)據(jù),因此有必要先了解這些,以便我們在處理數(shù)據(jù)時,確切地知道哪些數(shù)據(jù)結(jié)構(gòu)將有效地解決我們的目的。

數(shù)據(jù)結(jié)構(gòu)1:Python中的列表

Python中的列表是最通用的數(shù)據(jù)結(jié)構(gòu),它們用于存儲異構(gòu)數(shù)據(jù)項(xiàng),從整數(shù)到字符串,甚至是另一個列表!它們也是可變的,這意味著即使在創(chuàng)建列表之后,它們的元素也可以更改。

創(chuàng)建列表

列表是通過將元素括在[]內(nèi)創(chuàng)建的,每個項(xiàng)用逗號分隔:

由于列表中的每個元素都有自己不同的位置,因此在列表中具有重復(fù)的值不是問題:

訪問列表元素

我們使用索引來訪問列表的元素。列表中的每個元素都有一個與其相關(guān)的索引,這取決于它在列表中的位置。列表的第一個元素有索引0,下一個元素有索引1,依此類推。列表的最后一個元素的索引小于列表的長度。

但索引不一定總是正的,也可能是負(fù)的。你認(rèn)為負(fù)索引意味著什么?

正索引從列表起始位置開始計(jì)數(shù),而負(fù)索引從列表末尾開始計(jì)數(shù)。如果我們想從列表的末尾返回第n個元素,這就避免了我們必須執(zhí)行的瑣碎計(jì)算。因此,對于列表的最后一項(xiàng),我們不需要返回List_name[len(List_name)-1] 元素,只需編寫List_name[-1]。

使用負(fù)索引,我們可以輕松地返回列表末尾的第n個元素。如果我們想從結(jié)尾返回第一個元素,或者最后一個索引,那么關(guān)聯(lián)的索引是-1。類似地,倒數(shù)第二個元素的索引將是-2,依此類推。記住,第0個索引仍然引用列表中的第一個元素。

但是如果我們想返回列表中兩個位置之間的一系列元素呢?這叫做切片。我們要做的就是指定開始和結(jié)束索引,例如List_name[start : end]。

這里要記住的一件重要的事情是,結(jié)束索引處的元素永遠(yuǎn)不包含在內(nèi),只返回從開start索引到等于end-1索引的元素。

在列表中追加值

我們可以使用**append()**或 insert() 方法向現(xiàn)有列表中添加新元素:

append(),在列表末尾添加一個元素

insert(),在指定的特定位置將元素添加到列表

從列表中刪除元素

從列表中刪除元素與添加元素一樣簡單,可以使用**remove()或pop()**方法完成:

remove()–從列表中刪除與給定值匹配的第一個匹配項(xiàng)

pop()–當(dāng)我們要從列表中移除指定索引處的元素時使用。但是如果我們不提供索引值,最后一個元素將從列表中刪除

排序列表

大多數(shù)情況下,你將使用列表對元素進(jìn)行排序。因此了解**sort()**方法非常重要。它允許你按升序或降序?qū)α斜碓剡M(jìn)行就地排序:

但是當(dāng)你想要對包含字符串元素的列表進(jìn)行排序時,事情就變得有點(diǎn)棘手了。你如何比較兩個字符串?好吧,字符串值是使用字符串中字符的ASCII值排序的,字符串中的每個字符都有一個與其關(guān)聯(lián)的整數(shù)值,我們使用這些值對字符串進(jìn)行排序。

在比較兩個字符串時,我們只是從一開始比較每個字符的整數(shù)值。如果在兩個字符串中遇到相同的字符,我們只需比較下一個字符,直到找到兩個不同的字符。當(dāng)然這是內(nèi)部完成的,所以你不必?fù)?dān)心!

合并列表

我們甚至可以通過簡單地使用+符號連接兩個或多個列表,這會返回一個新列表,其中包含兩個列表中的元素:

列表推導(dǎo)式

列表的一個非常有趣的應(yīng)用是列表推導(dǎo)式,它提供了一種創(chuàng)建新列表的簡潔方法。這些新列表是通過對現(xiàn)有列表的每個元素應(yīng)用操作創(chuàng)建的。如果我們首先檢查一下如何使用舊的for循環(huán)來完成它:

現(xiàn)在,我們將看到如何使用列表理解簡潔地執(zhí)行此操作:

看到區(qū)別了嗎?列表推導(dǎo)式對于任何數(shù)據(jù)科學(xué)家來說都是一項(xiàng)有用的語法,因?yàn)槟憧梢钥吹胶途帉懞喢饕鬃x的代碼!

堆棧和隊(duì)列

列表是Python中內(nèi)置的數(shù)據(jù)結(jié)構(gòu),但我們可以使用它來創(chuàng)建用戶定義的數(shù)據(jù)結(jié)構(gòu)。使用列表構(gòu)建的兩種非常流行的用戶定義數(shù)據(jù)結(jié)構(gòu)是棧和隊(duì)列。

棧是一個元素列表,其中元素的添加或刪除是從列表的末尾開始的,可以把它想象成一堆書,當(dāng)你需要從書堆中添加或刪除一本書時,你可以從頂部開始。它使用了后進(jìn)先出的簡單概念。

另一方面,隊(duì)列是一個元素列表,其中元素的添加發(fā)生在列表的末尾,而元素的刪除則發(fā)生在列表的前面。你可以把它想象成現(xiàn)實(shí)世界中的一個隊(duì)列,當(dāng)前面的人離開隊(duì)列時,隊(duì)列變短;當(dāng)有新成員從末尾添加到隊(duì)列中時,隊(duì)列將變長。它使用先進(jìn)先出的概念。

現(xiàn)在,作為一個數(shù)據(jù)科學(xué)家或分析師,你可能不是每天都在使用這個概念,但是當(dāng)你必須構(gòu)建自己的算法時,它肯定會幫助你!

數(shù)據(jù)結(jié)構(gòu)2:Python中的元組

元組是Python中另一種非常流行的內(nèi)置數(shù)據(jù)結(jié)構(gòu),它們與列表非常相似,只不過有一個區(qū)別,它們是不可變的,這意味著一旦生成元組,就不能添加、刪除或編輯任何值。

我們將進(jìn)一步探討這個問題,但首先讓我們看看如何在Python中創(chuàng)建元組!

在Python中創(chuàng)建元組

元組可以通過在(括號)內(nèi)寫入值來生成,每個元素用逗號分隔,但是即使你寫了一堆沒有任何括號的值并把它們賦給一個變量,你最終還是會得到一個元組!

好了,現(xiàn)在我們知道了如何創(chuàng)建元組,讓我們討論一下不變性。

元組的不變性

在Python中,任何在創(chuàng)建后不能修改的內(nèi)容都是不可變的。Python語言可以分解為可變和不可變的對象。

列表、字典、集合(我們將在后面的章節(jié)中探討這些)是可變對象,這意味著它們可以在創(chuàng)建后修改;另一方面,整數(shù)、浮點(diǎn)數(shù)、布爾值、字符串甚至元組都是不可變的對象,但是,是什么使它們不可改變呢?

Python中的所有內(nèi)容都是一個對象,所以我們可以使用內(nèi)置的**id()**方法來檢查對象的內(nèi)存位置,這被稱為對象的標(biāo)識。讓我們創(chuàng)建一個列表并確定列表及其元素的位置:

如你所見,列表及其元素在內(nèi)存中都有不同的位置。因?yàn)槲覀冎懒斜硎强勺兊模晕覀兛梢愿淖兤湓氐闹。讓我們這樣做,看看它如何影響:

列表的位置沒有改變,但元素的位置改變了,這意味著為元素創(chuàng)建了一個新對象并保存在列表中,這就是可變的意思。可變對象可以在創(chuàng)建后更改其狀態(tài)或內(nèi)容,但不可變對象不能這樣做。

但是我們可以調(diào)用元組偽不可變,因?yàn)榧词顾鼈兪遣豢勺兊,它們也可以包含其值可以修改的可變對象?/p>

從上面的示例中可以看到,我們能夠更改元組中包含的不可變對象list的值。

元組賦值

元組打包和解包是一些有用的操作,你可以執(zhí)行這些操作來將值賦給單行中另一個元組。

當(dāng)我們制造元組時,我們已經(jīng)看到了元組的打包。元組解包與打包相反。

它對于在一行中交換值非常有用。老實(shí)說,這是讓我對Python感到興奮的第一件事,能夠用這么少的代碼做這么多事情!

更改元組值

雖然我說過元組值不能更改,但實(shí)際上可以通過使用list()將其轉(zhuǎn)換為列表來對其進(jìn)行更改。完成更改后,可以再次使用tuple()將其轉(zhuǎn)換回元組。

然而,這種更改非常昂貴,因?yàn)樗枰獜?fù)制元組,但是當(dāng)你不希望其他人更改數(shù)據(jù)結(jié)構(gòu)的內(nèi)容時,元組就派上了用場。數(shù)據(jù)結(jié)構(gòu)3:Python中的字典

Dictionary是另一種Python數(shù)據(jù)結(jié)構(gòu),用于存儲不可變但無序的異構(gòu)對象,這意味著當(dāng)你試圖訪問這些元素時,它們的順序可能與你插入它們的順序不完全相同。

但是,使詞典與列表區(qū)別開來的是元素在其中的存儲方式。字典中的元素是通過它們的鍵值而不是它們的索引來訪問的,正如我們在列表中所做的那樣,所以字典包含鍵值對,而不僅僅是單個元素。

生成詞典

字典是通過{}括號內(nèi)寫入鍵和值生成的。每個鍵值對用逗號分隔:

使用鍵,我們可以輕松提取關(guān)聯(lián)值:

這些鍵是獨(dú)一無二的,即使字典中有多個項(xiàng)具有相同的鍵,項(xiàng)的值為最后一個鍵關(guān)聯(lián)的值:

字典對于快速訪問項(xiàng)非常有用,因?yàn)榕c列表和元組不同,字典不必遍歷所有找到值的項(xiàng)。字典使用哈希提高性能。

訪問鍵和值

你可以使用 keys() 方法從字典訪問鍵,使用**values()方法訪問值。我們可以使用for循環(huán)查看它們,也可以使用list()**將它們轉(zhuǎn)換為列表:

我們甚至可以使用**items()**方法同時訪問這些值,該方法返回字典中每個元素的相應(yīng)鍵值對。

數(shù)據(jù)結(jié)構(gòu)4:Python中的集合

有時不希望在列表或元組中多次出現(xiàn)同一個元素。在這里,你可以使用集合數(shù)據(jù)結(jié)構(gòu)。Set是一個無序但可變的元素集合,它只包含唯一的值。

你將看到這些值的順序與在集合中輸入的順序不同,這是因?yàn)榧鲜菬o序的。

從集合中添加和移除元素

要向集合中添加值,請使用**add()**方法,它允許你添加除可變對象以外的任何值:

要從集合中移除值,有兩個選項(xiàng)可供選擇:

第一個是**remove()**方法,如果元素不在集合中,它會給出一個錯誤

第二個是discard() 方法,它刪除元素,但當(dāng)元素不在集合中時不會出錯

如果該值不存在,remove()將給出一個錯誤,而discard() 則不會。

集合操作

使用Python集合,你可以執(zhí)行兩個集合之間的并集、交集和差集等操作,就像在數(shù)學(xué)中一樣。

兩個集合的并集給出兩個集合的值,這些值是獨(dú)一無二的。因此,如果兩個集合包含相同的值,則只返回一個副本:

兩個集合的交集只返回兩個集合共有的值:

一個集合與另一個集合的差集只給出第一個集合中不存在的值:

結(jié)尾

Python是一種很好的語言。它為你提供了許多選項(xiàng)來更有效地處理數(shù)據(jù),學(xué)習(xí)Python中的數(shù)據(jù)結(jié)構(gòu)是你學(xué)習(xí)過程中的一個關(guān)鍵。

聲明: 本文由入駐維科號的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評論

暫無評論

    掃碼關(guān)注公眾號
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯
    x
    *文字標(biāo)題:
    *糾錯內(nèi)容:
    聯(lián)系郵箱:
    *驗(yàn) 證 碼:

    粵公網(wǎng)安備 44030502002758號