從Python認識資料結構(一).陣列

更新於 發佈於 閱讀時間約 4 分鐘
raw-image

各位好,因為Python這款程式語言與其他語言的資料結構稍有不同,加上網路與書籍較少討論到以Python去實作資料結構的內容,所以我想透過幾個章節來介紹Python中的資料結構。


第一章、陣列的基本介紹

陣列(Array)是一種常見的資料結構,可以想像成可以一個長型櫃子,每層都可以放入一筆資料。陣列可分為靜態與動態結構,若由有順序的記憶體位置儲存資料可稱為靜態結構,相反的,若使用不連續的記憶體來儲存,則被稱為動態結構。

在Python中,陣列的靜態結構可由串列(List)來進行設計,動態結構則可透過鍊結串列(Linked List)來實踐,由於是最基本且最容易執行的資料結構,我們就將陣列放在第一講中先行介紹,後續我們會分別透過靜態與動態結構來執行走訪、新增、刪除、反轉、插入、搜尋等等各式常見功能。


1-1、透過靜態串列(List)方式實踐陣列

串列是一種緊密相連,且「連續性」儲存於記憶體位置的一種資料結構,好比一條街道的地址,通常是以連續的方式儲存。在Python中,List常用的屬性有四種,分別是串列名稱、維度、元素個數和索引值。

串列名稱顧名思義就是該串列的名稱,同時也會指向此陣列在記憶體中被儲存的位置;維度則代表此串列中的資料維度,如一維串列、二維串列等等;元素個數則是指串列中總元素個數有幾項;索引(index)是串列中用來指定元素位置的一種方式,在Python中,第一個元素的索引值是0,第二個是1,以此類推,也可以說第一個元素的索引值是0。

串列中每一個元素可以為任一資料型態,無需事先宣告,透過中括弧[ ]將資料包含在內,即可完成串列的宣告。以下方程式碼為例,list_demo中包含了數字與文字兩種資料型態,索引值為0的元素為1,索引值為1的元素為Apple,一共有三個元素。此外,若我們事先不曉得元素的內容,則可透過[None]這種方式先行佔據記憶體位置,提供後續資料儲存。



1-2、透過鏈結串列(Linked-List)實踐陣列

在Python上透過靜態結構來建立陣列的方式有一項明顯的缺點,那就是我們必須先宣告陣列中的元素個數。若我們事先不知道可能會用到的元素個數,我們必須先假定一個較大的元素個數供未來使用,這可能會導致部分記憶體空間沒有被使用到而浪費掉了,鏈結串列則可解決此浪費記憶體空間的問題

鏈結串列如同火車車廂般,可以隨時依照使用者需求大小而動態改變鏈結的個數,並將元素儲存至各車廂中,隨時可進行動態增加或刪除,鏈結始終保持前後關係,將不連續的記憶體透過鍊結的方式維繫關係,為了能成功走訪所有鏈結,我們須確保每一個車廂都有被連接到,最後要走訪時在以首節點為起點,循序走訪所有資料,底下程式碼透過以員工資料做為範例,每個節點儲存三筆資料,分別為name、salary與下個節點位置,請看範例。



1-3、陣列的走訪

走訪陣列的方式十分簡單,若是靜態結構,我們僅須透過for迴圈即可尋訪所有元素;若是採用動態的鏈結串列,首先我們必須先將當下的位置指向首節點後的節點位置,開始判斷當下的節點位置是否為空值,若否,則依序走訪,並印出相關資訊,當我們走到最後一個位置時,該指標應為None,便不會進入迴圈中,我們可以試著將走訪單向串列寫成一個函式show,方便後續呼叫使用。

下一節我們會繼續討論陣列中靜態結構與動態結構新增、修改元素的方式,有任何問題歡迎寄信至我的信箱或於底下留言和我討論。



參考書目

  1. 圖解資料結構 - 使用Python(第二版)
  2. 圖書演算法 - 使用Python
  3. Python3 物件導向程式設計 第二版
  4. 精通Python (第二版)
留言
avatar-img
留言分享你的想法!
avatar-img
炯男孩的沙龍
4會員
8內容數
本專題將以Python程式語言來實作資料結構,依序從陣列(Array)、堆疊(Stack)、佇列(Queue)、樹(Tree)到圖(Graph),透過不同方式來建立資料結構,並討論部分細節如:建構難度、記憶體空間、效率等等。
炯男孩的沙龍的其他內容
2022/08/09
本文為陣列實作的延伸,特別介紹鏈結串列不同的方式,以解決一些常發生在鏈結串列上的問題,並比較不同做法的優缺點。
Thumbnail
2022/08/09
本文為陣列實作的延伸,特別介紹鏈結串列不同的方式,以解決一些常發生在鏈結串列上的問題,並比較不同做法的優缺點。
Thumbnail
2022/07/12
本文會介紹靜態結構 - 串列(List)與動態結構 - 鏈結串列(Linked List)來實踐陣列的不同功能,如:刪除、計算元素個數與反轉。
Thumbnail
2022/07/12
本文會介紹靜態結構 - 串列(List)與動態結構 - 鏈結串列(Linked List)來實踐陣列的不同功能,如:刪除、計算元素個數與反轉。
Thumbnail
2022/07/08
本文延續從上一篇文章的內容,繼續來介紹如何分別以靜態結構 - 串列(List)及鏈結串列(Linked List)兩種不同的方式來建立實作陣列的新增及修改元素功能。
Thumbnail
2022/07/08
本文延續從上一篇文章的內容,繼續來介紹如何分別以靜態結構 - 串列(List)及鏈結串列(Linked List)兩種不同的方式來建立實作陣列的新增及修改元素功能。
Thumbnail
看更多
你可能也想看
Thumbnail
在資料結構與演算法裡, 最簡單的線性資料結構除了list之外就是linked list鏈結串列了。 Linked list又有分為單向Singly linked list 和雙向Doubly linked list 在這篇文章,會從最基礎的Singly linked list開始講起。 定義
Thumbnail
在資料結構與演算法裡, 最簡單的線性資料結構除了list之外就是linked list鏈結串列了。 Linked list又有分為單向Singly linked list 和雙向Doubly linked list 在這篇文章,會從最基礎的Singly linked list開始講起。 定義
Thumbnail
Array可以說是各種語言除了基本型別之外,最常用的資料型別與容器之一了。 Array 這種連續格子狀的資料結構,在Python要怎麼表達呢? 建立一個空的陣列 最簡單也最直接的寫法就是 array = [] # Python list [] 就對應到大家熟知的array 陣列型態的資料結
Thumbnail
Array可以說是各種語言除了基本型別之外,最常用的資料型別與容器之一了。 Array 這種連續格子狀的資料結構,在Python要怎麼表達呢? 建立一個空的陣列 最簡單也最直接的寫法就是 array = [] # Python list [] 就對應到大家熟知的array 陣列型態的資料結
Thumbnail
👨‍💻簡介 陣列就像是一個儲存相同類型資料的容器,你可以想像成裝滿了一樣東西的盒子,每個東西都叫做陣列元素。這種類型可以是基本的,像是整數或字串,也可以是你自己定義的型別。不過陣列有個限制,就是大小一旦確定就無法改變。在Go語言裡,陣列的長度也是型別的一部分。
Thumbnail
👨‍💻簡介 陣列就像是一個儲存相同類型資料的容器,你可以想像成裝滿了一樣東西的盒子,每個東西都叫做陣列元素。這種類型可以是基本的,像是整數或字串,也可以是你自己定義的型別。不過陣列有個限制,就是大小一旦確定就無法改變。在Go語言裡,陣列的長度也是型別的一部分。
Thumbnail
探索Python學習筆記中列表的建立、存取和常用方法。從使用中括號定義列表到了解索引、新增、刪除、修改等操作,並介紹append、remove、count等常用方法。
Thumbnail
探索Python學習筆記中列表的建立、存取和常用方法。從使用中括號定義列表到了解索引、新增、刪除、修改等操作,並介紹append、remove、count等常用方法。
Thumbnail
  陣列(Array)是什麼?它是一個很好用的東西哦!當我們要處理100個學生的成績的時候,如果沒有陣列的話,那麼我們的變數就要命名100個不同的變數,這樣的程式雖然不是不能執行,想一想,是不是有一點要在命名上會想破頭殼呢?因為要想100個不同的變數麻~   你說:「那就變數後面加入編號就好啦~如
Thumbnail
  陣列(Array)是什麼?它是一個很好用的東西哦!當我們要處理100個學生的成績的時候,如果沒有陣列的話,那麼我們的變數就要命名100個不同的變數,這樣的程式雖然不是不能執行,想一想,是不是有一點要在命名上會想破頭殼呢?因為要想100個不同的變數麻~   你說:「那就變數後面加入編號就好啦~如
Thumbnail
Array 在記憶體中連續分配,而且元素類型是一樣的,長度不變 優點:讀取快,可以使用座標訪問 缺點:新增、刪除慢 記憶體: 📷 範例程式碼: ArrayList 不定長度,在記憶體中連續分配的,元素沒有類型限制,任何元素都是當成object處理,如果是值類型,會有裝箱的操作 優點:讀取快 缺點:
Thumbnail
Array 在記憶體中連續分配,而且元素類型是一樣的,長度不變 優點:讀取快,可以使用座標訪問 缺點:新增、刪除慢 記憶體: 📷 範例程式碼: ArrayList 不定長度,在記憶體中連續分配的,元素沒有類型限制,任何元素都是當成object處理,如果是值類型,會有裝箱的操作 優點:讀取快 缺點:
Thumbnail
本文會介紹靜態結構 - 串列(List)與動態結構 - 鏈結串列(Linked List)來實踐陣列的不同功能,如:刪除、計算元素個數與反轉。
Thumbnail
本文會介紹靜態結構 - 串列(List)與動態結構 - 鏈結串列(Linked List)來實踐陣列的不同功能,如:刪除、計算元素個數與反轉。
Thumbnail
本文延續從上一篇文章的內容,繼續來介紹如何分別以靜態結構 - 串列(List)及鏈結串列(Linked List)兩種不同的方式來建立實作陣列的新增及修改元素功能。
Thumbnail
本文延續從上一篇文章的內容,繼續來介紹如何分別以靜態結構 - 串列(List)及鏈結串列(Linked List)兩種不同的方式來建立實作陣列的新增及修改元素功能。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News