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

更新於 發佈於 閱讀時間約 4 分鐘
陣列的最後一講
各位好,今天接續從Python認識資料結構(二).陣列中延伸,介紹如何用Python設計陣列結構來執行刪除元素、計算元素數量與反轉的功能。

3-1、刪除元素

我們如果運用靜態結構-串列(List)方式來建立陣列的話,那麼刪除元素主要有三種方式,根據不同需求採用不同函式,第一種是remove,語法是list.remove(元素),這種方法用於我們不用知道指定元素的索引值,可以直接從串列中將指定元素移除,但若指定元素沒有出現在串列中,則會回傳錯誤訊息。
第二種移除元素的方法是pop,語法是list.pop(元素的索引值),與remove不同的是,pop需要知道該元素確切的索引值才可進行移除,且pop後會回傳該索引值的元素,並將其移除串列中,若使用pop卻不給定元素的索引值,則會移除串列最後一個元素並回傳。最後一種方法是del,語法是del list[索引值],與上述pop方法不同的是,del函式並不會回傳該元素,而是直接將其刪除。
若採用鏈結串列(Linked List)的方式建立陣列,刪除的要求可分為刪除最前面的元素、最後的元素及指定元素。若要刪除最前面的元素,我們可以將head的next屬性改為第一個元素的next屬性,如此一來,原先第二個元素就會被接在head後方,完成第一個元素的刪除,此時的刪除並非將其移除記憶體空間,而是改變鏈結的順序,刻意丟失該元素的資訊而已。
在鏈結串列要刪除最後一個元素,我們先找到倒數第二個節點位置,並將此節點的next屬性改為None,此時倒數第二個節點後就沒有資料點,其成為倒數最後一個節點,也就完成上述功能最後一種刪除指定的元素的作法,我們同樣先找到指定元素的前一個節點位置,並將指定元素前個節點的next屬性改為指定元素的next屬性,這個部分可以會比較難以理解,提供一張鏈結的圖來想像一下過程。
從上述三種鏈結串列刪除方法可以發現,透過鏈結串列來實作刪除功能時,我們並非真的去刪除節點,而是透過更改next屬性來刻意的丟失該節點資料,使鏈結串列在尋訪過程中不被走訪。

3-2、計算元素數量

大概介紹完陣列的主要功能,接下來就介紹一些實用的語法,並嘗試在鏈結串列中進行實作,第一個是count,這個函數可以統計指定元素在串列中出現的個數,語法為list.count(指定元素)。若要在鏈結串列中實作,我們可以初始化一個計數器,並走訪所有節點,將鏈結串列中所有等於指定元素的節點個數計算出來。

3-3、 反轉功能

在靜態串列中要進行反轉相當容易,方法為list.reverse(),此函數會直接更改list內容。但在鏈結串列中,順序的反轉就需要經過特別設計,我們首先宣告兩個變數temp與prev來儲存節點資訊,從第一個資料點開始進行迴圈。
將第一個資料節點的next屬性存進temp,並將next改為前位節點(第一次是預設的None),接著將自己存為prev,當作下個迴圈的前位節點,接著移動到下一個節點位置繼續此四步驟。當更改完最後一個迴圈時,我們還要將head的next屬性改到最後一個節點位置,於是將head.next設為prev所儲存的最後一個節點。
上圖是鏈結串列反轉的示意圖,後面迴圈的邏輯都一樣,紅框代表在一次迴圈中會被更動到的變數,這個部分比較困難,應該也還有更好的做法,都歡迎討論看看XD。以上部分就是Python陣列的主要介紹,下一節我們會繼續介紹鏈結串列的延伸與實作,有任何問題歡迎寄信至我的信箱或於底下留言和我討論。

參考書目

  1. 圖解資料結構 - 使用Python(第二版)
  2. 圖書演算法 - 使用Python
  3. Python3 物件導向程式設計 第二版
  4. 精通Python (第二版)
avatar-img
4會員
8內容數
本專題將以Python程式語言來實作資料結構,依序從陣列(Array)、堆疊(Stack)、佇列(Queue)、樹(Tree)到圖(Graph),透過不同方式來建立資料結構,並討論部分細節如:建構難度、記憶體空間、效率等等。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
炯男孩的沙龍 的其他內容
本文延續從上一篇文章的內容,繼續來介紹如何分別以靜態結構 - 串列(List)及鏈結串列(Linked List)兩種不同的方式來建立實作陣列的新增及修改元素功能。
陣列是Python語言的最基礎也最容易實作的資料結構,主要可以透過兩種方式在Python上實踐陣列,其中一種是靜態結構 - 串列(List),另一種則是動態結構 - 鏈結串列(Linked List)。 我們會依序介紹這兩種作法如何在Python上執行陣列的相關功能,並比較兩種方法之間的差異。
本文延續從上一篇文章的內容,繼續來介紹如何分別以靜態結構 - 串列(List)及鏈結串列(Linked List)兩種不同的方式來建立實作陣列的新增及修改元素功能。
陣列是Python語言的最基礎也最容易實作的資料結構,主要可以透過兩種方式在Python上實踐陣列,其中一種是靜態結構 - 串列(List),另一種則是動態結構 - 鏈結串列(Linked List)。 我們會依序介紹這兩種作法如何在Python上執行陣列的相關功能,並比較兩種方法之間的差異。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
介紹如何使用 JavaScript 中的陣列基本增刪元素方法,包括新增、刪除和替換元素的詳細說明。介紹的主要方法有 unshift、push、shift、pop、splice 和 slice,並解釋它們的使用場景和返回值。
Thumbnail
在資料結構與演算法裡, 最簡單的線性資料結構除了list之外就是linked list鏈結串列了。 Linked list又有分為單向Singly linked list 和雙向Doubly linked list 在這篇文章,會從最基礎的Singly linked list開始講起。 定義
Thumbnail
在 Python 中,tuple 與 List有一個關鍵的不同點:tuple 是不可變的,這意味著一旦創建了 tuple,就無法更改其內容。 這與 List的可變性形成了對比,list 可以新增、刪除或修改元素。 元素的意思: 元素:指的是 List 中的每一個獨立的項目或值。
Thumbnail
Array可以說是各種語言除了基本型別之外,最常用的資料型別與容器之一了。 Array 這種連續格子狀的資料結構,在Python要怎麼表達呢? 建立一個空的陣列 最簡單也最直接的寫法就是 array = [] # Python list [] 就對應到大家熟知的array 陣列型態的資料結
Thumbnail
題目敘述 題目給定一個鏈結串列中的節點Node,要求我們從鏈結串列中刪除該節點。 題目保證該節點不是tail node。 題目要求我們in-place原位操作。 原本的英文題目敘述 測試範例 Example 1: Input: head = [4,5,1,9], node = 5
Thumbnail
題目敘述 輸入給定一個鏈結串列的head node。 要求我們進行化簡,只要某個節點的右手邊存在比較大的節點,就刪除掉。 例如 5->2->13->3 5的右手邊有13,所以5刪除掉。 2的右手邊有13,所以2刪除掉。 13的右手邊沒有更大的節點,所以13留著。 3的右手邊沒有更大
Thumbnail
題目敘述 題目會給定一個鏈結串列的起始點,要求我們把其中區間總和為0的部分刪除掉。 例如 1→ 2 → -2 → 3 → 4 裡面有一段是2 → -2 區間總和為零,所以簡化刪除後變成 1→ 3 → 4 題目的原文敘述 測試範例 Example 1: Input: head
Thumbnail
題目敘述 題目會給定一個鏈結串列 Linked List的頭部結點,要求我們根據索引的奇偶數重新排列。奇數索引的在前,偶數索引的在後。數的時候,從Head節點的索引=1開始數。 例如: 1 -> 2 -> 3 -> 4 -> 5 重新排列為 1 -> 3 -> 5 -> 2 -> 4
Thumbnail
題目敘述 題目會給定我們一條鏈結串列Linked list的起始節點,要求我們刪除Linked List正中央的節點。 註: 正中央的節點,題目定義為索引為floor( 串列長度 / 2 ) 的節點,索引從零(Head Node)出發開始數。 例如 1 -> 2 -> 3 -> 4 鏈結
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
介紹如何使用 JavaScript 中的陣列基本增刪元素方法,包括新增、刪除和替換元素的詳細說明。介紹的主要方法有 unshift、push、shift、pop、splice 和 slice,並解釋它們的使用場景和返回值。
Thumbnail
在資料結構與演算法裡, 最簡單的線性資料結構除了list之外就是linked list鏈結串列了。 Linked list又有分為單向Singly linked list 和雙向Doubly linked list 在這篇文章,會從最基礎的Singly linked list開始講起。 定義
Thumbnail
在 Python 中,tuple 與 List有一個關鍵的不同點:tuple 是不可變的,這意味著一旦創建了 tuple,就無法更改其內容。 這與 List的可變性形成了對比,list 可以新增、刪除或修改元素。 元素的意思: 元素:指的是 List 中的每一個獨立的項目或值。
Thumbnail
Array可以說是各種語言除了基本型別之外,最常用的資料型別與容器之一了。 Array 這種連續格子狀的資料結構,在Python要怎麼表達呢? 建立一個空的陣列 最簡單也最直接的寫法就是 array = [] # Python list [] 就對應到大家熟知的array 陣列型態的資料結
Thumbnail
題目敘述 題目給定一個鏈結串列中的節點Node,要求我們從鏈結串列中刪除該節點。 題目保證該節點不是tail node。 題目要求我們in-place原位操作。 原本的英文題目敘述 測試範例 Example 1: Input: head = [4,5,1,9], node = 5
Thumbnail
題目敘述 輸入給定一個鏈結串列的head node。 要求我們進行化簡,只要某個節點的右手邊存在比較大的節點,就刪除掉。 例如 5->2->13->3 5的右手邊有13,所以5刪除掉。 2的右手邊有13,所以2刪除掉。 13的右手邊沒有更大的節點,所以13留著。 3的右手邊沒有更大
Thumbnail
題目敘述 題目會給定一個鏈結串列的起始點,要求我們把其中區間總和為0的部分刪除掉。 例如 1→ 2 → -2 → 3 → 4 裡面有一段是2 → -2 區間總和為零,所以簡化刪除後變成 1→ 3 → 4 題目的原文敘述 測試範例 Example 1: Input: head
Thumbnail
題目敘述 題目會給定一個鏈結串列 Linked List的頭部結點,要求我們根據索引的奇偶數重新排列。奇數索引的在前,偶數索引的在後。數的時候,從Head節點的索引=1開始數。 例如: 1 -> 2 -> 3 -> 4 -> 5 重新排列為 1 -> 3 -> 5 -> 2 -> 4
Thumbnail
題目敘述 題目會給定我們一條鏈結串列Linked list的起始節點,要求我們刪除Linked List正中央的節點。 註: 正中央的節點,題目定義為索引為floor( 串列長度 / 2 ) 的節點,索引從零(Head Node)出發開始數。 例如 1 -> 2 -> 3 -> 4 鏈結
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。