給自學者的Python教學(8):資料結構與列表 (List)

YC
Nov 18, 2020

--

在 Python 當中,有提供四種超常用的資料結構,分別是︰列表 (List)、元組(Tuple)、字典 (Dict) 與集合 (Set),而這次我們先來討論一下列表 (List)。

Photo by David Ballew on Unsplash

但首先,我們應該瞭解什麼是資料結構有人會把它們稱為「容器對象」「序列對象」、「結構化資料型態」,可能會讓很多初學者不知道到底哪個才是對的。在 Python 的文件檔中,把 List、Tuple、Dict、Set等都定義為 Data Structure,所以在本文中我就以資料結構來表示這幾種工具。

定義:在電腦科學中,資料結構(英語:data structure)是電腦中儲存、組織資料的方式。 (撰自:維基百科)
(老實說,我第一次覺得 Wiki 的定義寫得真不錯。)

其實就真的是如定義一樣的簡單易懂。大家可以細想一下,我們可以有多種型別,如 String、char、Integer 等等。但我們要如何在程式上表達我們有一大堆相同類型的資料?總不能真的宣告 30 個不同的變數,再一個個賦值。

From : GIFHY

這時候就是運用資料結構的時機了,我們透過運用不同的資料結構,來組織好一堆資料,就像書店會把書分類到不同的書櫃上一樣︰

// 不可能任務:把一萬把情書一個個宣告出來,再一個個賦值
loveStory1 = "新時代的愛"
loveStory2 = "舊時代的恨"
... ...
loveStory10000 = "愛上Python一萬年"
// 可能任務:運用資料結構!
loveStoryList = ["新時代的愛", "舊時代的恨", "愛上Python一萬年"]// 我們可以把所有的情書都放到 loveStoryList中,要找情書?快去找這個列表就對啦!
From : GIFHY

我們可以好好的組織我們的資料,把同類型的資料放在一起,以供我們日後操作這些資料使用,如搜尋、新增、刪除、更新資料等。當然,也可以避免不同的資料散落一地。

列表 (List) 正正就是一種最最最常用的資料結構。跟很多語言的陣列 (Array) 不一樣,Python 的列表我會說它不只是陣列 (Array)

什麼是不只是陣列?即列表除了可以作為陣列以外,列表還可以作為堆疊 (Stack) 與隊列 (Queues)。

堆疊 (Stack) 跟隊列 (Queues) 都是資料結構的一種,只是這不是文章的目標,我們先不作深入討論,只需要知道它們分別有一些很好用的操作,會在下方簡單介紹。

列表是一系列相同類別的資料所組成的資料結構。所以不是相同類別的資料可以放到同一個列表嗎?對,是不成的!

列表非常適合利用順序和位置定位某一元素。列表是可變的,你可以直接對原始列表進行修改。添加新元素、刪除或覆蓋已有元素。在列表中,具有相同值的元素可以重複出現。
(場外小知識,Python 的 String 並不是列表,因為 Python 的 String 是不可變的!)

除了字串外,我們還可以放任意的類型進列表中,例如:整數、浮數點、布林值等等。說了這麼多,那到底要怎麼創建列表?我們可以︰

如左圖,我們可以使用 [ ]或 list() 方法來創建一個空列表。

列表中有超多功能可以被介紹,下面我挑了一些比較重要的來示範一下:

列表中的元素該如何取得或修改?我們可以使用 offset,也就是偏移量!offset 都是從 0 開始再往後一直遞增的,假如今天我們的列表中有三個元素,那 ‘John’ 的偏移量就是 0,因為他就是第一個元素,沒有偏移掉。那 ‘Carol’ 的偏移量就是 1,因為它比第一個元素往後排一位。以此類推, ‘GG’ 的偏移量就是 2 囉!

From : GIFHY

我們可以輕易通過 offset 提取或改變列表中的元素,也可以配合 for loop 來歷遍列表中的所有元素!

另外, Python 也提供反向 offset 的功能,也就是可以用負數來從底部元素開始取得元素!

現在來看看列表超強的四大功能,切片 (Slice)、擴充 (extend)、插入 (insert)、移除 (remove) /(del)!

切片 (Slice)

左邊的切片功能我個人是覺得 Python 超強的功能。跟使用 offset 類似,我們可以在 [ ] 加上 “ : ” 符,他們的規格是這樣:

列表[offset 起始值 : offset 結束值 : 步數]

超始值:就是你想要從第幾個偏移量開始取得元素
結束值:就是你想要在第幾個偏移量結束切片,這邊比較巧妙的是,如果我們想取 offset [1] 的元素,我們就要在結束值 + 1 ,也就是要在偏移量為 2 時結束切片。
步數:是指每次切片會按照步數來略過元素預設值是 1。也就是說我們要填入比 1 大的正數或比 1 小的負數,間隔才會有效,如果步數是 1 的話,就是不會略過元素的意思,也就是為什麼上圖 [::2] 只有跳過一個元素。

說得更簡單一點!呀,平常走路都是一步一格的走,現在你一步走了兩格的距離,那腳踏下的位置就會是兩步之外,也就是在第三格囉!( 對了可以試試在步數填進 0 看看會發現什麼事!)

[::-1] 就是一個指從列表的尾巴往回走的意思。所以 [::-2] 然後就是從最後開始,跳過一個元素拿到往回算的第3個元素囉。

擴充 (extend)

左邊的擴充 (extend) 可以讓兩個列表進行合拼。

或使用 += 來將兩個列表合拼,被合拼的列表元素會放到列表的最後。

在 Python 中,我們可以把不同類型的元素放到同一個列表中。

插入 (insert)

使用插入 (insert) 可以在指定位置插入元素。

insert() 有兩個參數是必需要給的,第一個的參數是指想要插入元素的位置,要注意的是這邊的值是 offset 的值,如上圖的 3 指的是要在把元素插入到 [3] 的位置喔!
另一個參數當然就是放想要插入的元素囉。

而如果插位置是大於原來列素的 offset 量大小,Python 會自動插入到列表最後一個位置。

移除 (remove) /(del)

我們可以使用移除 (remove) 來移除指定的元素。

如果我們要透過 offset 來刪除元素,可以使用 del list[i]

另外,我們還有增補 (append) 跟拋出 (pop) 來實現 Stack 的功能。

增補 (append) 會把元素直接放到列表最後一位,這跟插入可以指定位置不一樣。

append 作用相反的是拋出 (pop),他會把列表最後一個元素拋出,回傳並移除被拋出的元素。

最後我們對列表會常用到兩個計算功能,計數 (count) 與長度 (len)。

對列表使用計數 (count) 可以計算出列表中某元素的數量。

使用長度 (len) 來獲得列表的長度是非常實用的功能。

最後的最後,Python 的列表可以說是非常強大的資料結構,上文還有很多沒有提到的功能,有興趣的朋友可以到 Python 文件看看有什麼工具可以對被列表使用。

如果你覺得我的文章幫助到你,希望你也可以為文章拍手與Follow 我的個人頁喔,支持我們推出更多更好的內容創作!

--

--

YC

提供更精確的技術內容為目標,另創立「程式愛好者」專頁。首席軟體工程師,專研後端技術、物件導向、軟體架構。