iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0
Python

30天導讀 Python Software Foundation 官方翻譯文件系列 第 11

Day 10 -資料結構~導讀 Python Software Foundation 教學文件

  • 分享至 

  • xImage
  •  

本文為 Python Software Foundation -->Python 3.12.6 說明文件 -->Python教學文件 --> 5. 資料結構 --> 5.1. 進一步了解 List(串列) 繁體中文版導讀文章

  • 內容為官方文章搭配 Colab 實測 demo 圖片,想了解實測請點擊Colab

資料結構

這個章節將會更深入的介紹一些你已經學過的東西的細節上,並且加入一些你還沒有接觸過的部分。

5.1. 進一步了解 List(串列)

List(串列)這個資料型態,具有更多操作的方法。下面條列了所有關於 list 物件的 method:

  • list.append(x):將一個新的項目加到 list 的尾端。等同於 a[len(a):] = [x]。
  • list.extend(iterable):將 iterable(可疊代物件)接到 list 的尾端。等同於 a[len(a):] = iterable。
  • list.insert(i, x):將一個項目插入至 list 中給定的位置。第一個引數為插入處前元素的索引值,所以 a.insert(0, x) 會插入在 list 首位,而 a.insert(len(a), x) 則相當於 a.append(x)。
  • list.remove(x):刪除 list 中第一個值等於 x 的元素。若 list 中無此元素則會觸發 ValueError。
  • list.pop([i]):移除 list 中給定位置的項目,並回傳它。如果沒有指定位置, a.pop() 將會移除 list 中最後的項目並回傳它。若 list 是空的或是索引值超出範圍,則會引發 IndexError 例外。
  • list.clear():刪除 list 中所有項目。這等同於 del a[:]。
  • list.index(x[, start[, end]]):回傳 list 中第一個值等於 x 的項目之索引值(從零開始的索引)。若 list 中無此項目,則丟出 ValueError 錯誤。
  • 引數 start 和 end 的定義跟在 slice 表示法中相同,搜尋的動作被這兩個引數限定在 list 中特定的子序列。但要注意的是,回傳的索引值是從 list 的開頭開始算,而不是從 start 開始算。
  • list.count(x):回傳 x 在 list 中所出現的次數。
  • list.sort(*, key=None, reverse=False):將 list 中的項目排序。(可使用引數來進行客製化的排序,請參考 sorted() 部分的解釋)
  • list.reverse():將 list 中的項目前後順序反過來。
  • list.copy():回傳一個淺複製 (shallow copy) 的 list。等同於 a[:]。

以下是一個使用到許多 list 物件方法的例子:
https://ithelp.ithome.com.tw/upload/images/20240925/20162673VAzEljGd0d.png
https://ithelp.ithome.com.tw/upload/images/20240925/201626730sgTYeJuQ8.png

你可能會注意到一些方法,像是 insert、remove 或者是 sort,並沒有印出回傳值,事實上,他們回傳預設值 None [1]。這是一個用於 Python 中所有可變資料結構的設計法則。
另外你可能也會發現,不是所有資料都可以被排序或比較。例如,[None, 'hello', 10] 就不可排序,因為整數不能與字串比較,而 None 不能與其他型別比較。有些型別根本就沒有被定義彼此之間的大小順序,例如,3+4j < 5+7j 就是一個無效的比較。

5.1.1. 將 List 作為 Stack(堆疊)使用

List 的操作方法使得它非常簡單可以用來實作 stack(堆疊)。Stack 為一個遵守最後加入元素最先被取回(後進先出,"last-in, first-out")規則的資料結構。你可以使用方法 append() 將一個項目放到堆疊的頂層。而使用方法 pop() 且不給定索引值去取得堆疊最上面的項目。舉例而言:
https://ithelp.ithome.com.tw/upload/images/20240925/20162673PanFh7iFjX.png

5.1.2. 將 List 作為 Queue(佇列)使用

我們也可以將 list 當作 queue(佇列)使用,即最先加入元素最先被取回(先進先出,"first-in, first-out")的資料結構。然而,list 在這種使用方式下效率較差。使用 append 和 pop 來加入和取出尾端的元素較快,而使用 insert 和 pop 來插入和取出頭端的元素較慢(因為其他元素都需要挪動一格)。
如果要實作 queue,請使用 collections.deque,其被設計成能快速的從頭尾兩端加入和取出。例如:
https://ithelp.ithome.com.tw/upload/images/20240925/20162673eeWeZ9YnVH.png

5.1.3. List Comprehensions(串列綜合運算)

List comprehension(串列綜合運算)讓你可以用簡潔的方法建立 list。常見的應用是基於一個序列或 iterable(可疊代物件),將每一個元素經過某個運算的結果串接起來成為新的 list,或是建立一個子序列,其每一個元素皆滿足一個特定的條件。
舉例來說,假設我們要建立一個「平方的 list」:
https://ithelp.ithome.com.tw/upload/images/20240925/20162673s6fUhW9P3e.png

注意這是建立(或覆寫)一個變數叫 x,其在迴圈結束後仍然存在。我們可以這樣產生平方串列而不造成任何 side effects(副作用):
https://ithelp.ithome.com.tw/upload/images/20240925/20162673gFqnLKKAN2.png

或與此相等的:
https://ithelp.ithome.com.tw/upload/images/20240925/20162673gBiqnsZJbw.png
這樣更簡潔和易讀。

一個 list comprehension 的組成,是在一對方括號內,放入一個 expression(運算式)、一個 for 子句、再接著零個或多個 for 或 if 子句。結果會是一個新的 list,內容是在後面的 for 和 if 子句情境下,對前面運算式求值的結果。例如,這個 list comprehension 組合了兩個 list 中彼此相異的元素:
https://ithelp.ithome.com.tw/upload/images/20240925/20162673vgFSRyZwst.png

而它就等於:
https://ithelp.ithome.com.tw/upload/images/20240925/20162673BRj9Kjh8SN.png

注意 forif 在這兩段程式裡的順序是相同的。

如果 expression 是一個 tuple(例如上面例子中的 (x, y)),它必須加上括號:
https://ithelp.ithome.com.tw/upload/images/20240925/20162673ugGMnMVse4.png
https://ithelp.ithome.com.tw/upload/images/20240925/20162673hqhMbN5C1u.png

List comprehensions 可以含有複雜的 expression 和巢狀的函式:
https://ithelp.ithome.com.tw/upload/images/20240925/20162673dkDExHNGQD.png

5.1.4. 巢狀的 List Comprehensions

在 list comprehesion 中開頭的 expression 可以是任何形式的 expression,包括再寫一個 list comprehension。

考慮以下表示 3x4 矩陣的範例,使用 list 包含 3 個長度為 4 的 list :
https://ithelp.ithome.com.tw/upload/images/20240925/20162673Ig9kyHPSe7.png

以下的 list comprehesion 會將矩陣的行與列作轉置:
https://ithelp.ithome.com.tw/upload/images/20240925/20162673GjFwqrSgJd.png

如同我們在上一節看到的,內部的 list comprehension 會依據後面的 for 環境被求值,所以這個例子就等於:
https://ithelp.ithome.com.tw/upload/images/20240925/20162673lRgOmK7rJ2.png

而它也和這一段相同:
https://ithelp.ithome.com.tw/upload/images/20240925/20162673HWMty12bdx.png

在實際運用上,我們傾向於使用內建函式 (built-in functions) 而不是複雜的流程控制陳述式。在這個例子中,使用 zip() 函式會非常有效率:
https://ithelp.ithome.com.tw/upload/images/20240925/20162673oIK5Btwx1B.png

關於星號的更多細節,請參考拆解引數列表(Unpacking Argument Lists)


上一篇
Day 9 -深入了解流程控制~導讀 Python Software Foundation 教學文件
下一篇
Day 11 -資料結構~導讀 Python Software Foundation 教學文件
系列文
30天導讀 Python Software Foundation 官方翻譯文件12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言