Python 簡易手冊
單元 39 - 串列
串列 (list) 是可變的 (mutable) 序列 (sequence) ,因此支援序列的通用操作
操作 | 說明 |
---|---|
x in s | 判斷 x 是否是 s 的元素 |
x not in s | 判斷 x 是否不是 s 的元素 |
s + t | 回傳合併 s 與 t 的新序列 |
s * n n * s | 回傳將 s 複製 n 倍的新序列 |
s[i] | 取得 s 中索引值為 i 的元素 |
s[i:j] | 取得 s 中索引值為 i 到 j - 1 的子序列 |
s[i:j:k] | 取得 s 中索引值為 i 到 j - 1 間隔 k 的子序列 |
len(s) | 回傳 s 中的元素總量 |
min(s) | 回傳 s 中的最小值 |
max(s) | 回傳 s 中的最大值 |
s.index(x[, i[, j]]) | 回傳 s 中 x 的索引值,或是 x 在 i 到 j 之間的索引值 |
s.count(x) | 回傳 x 在 s 中的數量 |
由於串列是可變的,因此串列還支援以下的操作方式
操作 | 說明 |
---|---|
s[i] = x | 將 s 中索引值為 i 的元素設定為 x |
s[i:j] = t | 將 s 中索引值 i 到 j - 1 的元素替換成 t 的元素 |
del s[i:j] | 刪除 s 中 i 到 j - 1 的元素 |
s[i:j:k] = t | 將 s 中索引值 i 到 j - 1 間隔 k 的元素替換成 t 的元素 |
del s[i:j:k] | 刪除 s 中索引值 i 到 j - 1 間隔 k 的元素 |
s.append(x) | 將 x 附加到 s 的最後 |
s.clear() | 刪除 s 中的所有元素 |
s.copy() | 回傳 s 的拷貝 |
s.extend(t) s += t | 合併 s 與 t |
s *= n | 將 s 複製 n 倍 |
s.insert(i, x) | 將 x 插入 s 中索引值為 i 的位置 |
s.pop() s.pop(i) | 移除 s 的最後一個元素或是索引值為 i 的元素 |
s.remove(x) | 移除 s 中的第一個 x |
s.reverse() | 反轉 s 中元素的順序 |
串列中的元素 (element) 可以是任意的資料型態 (data type) ,字面常數 (literal) 是中括弧,以下示範一些基本操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | # 定義串列 a = [1, 2, 3, 4, 5] # 利用索引值取得元素或子串列 print(a[1]) print(a[1:3]) print(a[1:4:2]) print(a[1:]) print(a[-2]) print(a[-2:]) # 以下兩者相等 print(a == a[:]) # 串列連接 a += [6, 7, 8] print(a) # 串列複製 a *= 2 # 刪除指定索引值範圍的元素 del a[3:12] print(a) # 重新設定索引值為 4 的元素 a[4] = 10 print(a) # 檔名: list_demo.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
第 2 行先用字面常數建立都是整數的串列,然後第 4 到第 9 行示範利用索引值取得元素或子串列,注意索引值是從 0 開始
3 4 5 6 7 8 9 | # 利用索引值取得元素或子串列 print(a[1]) print(a[1:3]) print(a[1:4:2]) print(a[1:]) print(a[-2]) print(a[-2:]) |
有冒號代表是取得子串列,規則很簡單,第一個數字表示起始索引值,第二個數字表示結束索引值,但是要計算個數,個數通常是第二個索引值減掉第一個索引值,所以 a[1:3] 表示索引值從 1 開始,到 3 結束,然後取 3 - 1 ,也就是取 2 個元素。
如果有第 2 個冒號接上第 3 個數字,這第 3 個數字代表間隔,像是 a[1:4:2] 就表示索引值從 1 開始,到 4 結束,間隔 2 ,也就是先取索引值為 1 的元素,然後取索引值 1 + 2 ,也就是索引值 3 的元素,下一個由於 3 + 2 是 5 ,已經超過最後的索引值,所以總共取得兩個元素。
如果冒號之後沒有接數字,那預設就是到串列的最後一個元素,因此 a[1:] 表示除了索引值 0 之外所有元素的子串列。
索引值也可以是負數,數字表示倒數第幾個元素,像是 a[-2] 就是倒數第二個元素,也可以加上冒號,像是 a[-2:] 就是倒數第 2 個元素到最後一個元素。
第 12 行,這裡是示範如果冒號前後沒有數字,就表示索引值從頭到尾都包含
11 12 | # 以下兩者相等 print(a == a[:]) |
第 15 行則是用加號與等號連接另一個串列
14 15 16 | # 串列連接 a += [6, 7, 8] print(a) |
指派運算子 (assignment operator) 在單元 14 - 指派陳述與指派運算式有詳細介紹。
下面第 19 行利用乘號及等號複製串列,然後第 21 行用關鍵字 (keyword) del 刪除指定索引值範圍的元素
18 19 20 21 22 | # 串列複製 a *= 2 # 刪除指定索引值範圍的元素 del a[3:12] print(a) |
單元 32 - del 陳述詳細介紹 del 陳述 (statement) 的用法。
最後第 25 行重新設定索引值為 4 的元素
24 25 26 | # 重新設定索引值為 4 的元素 a[4] = 10 print(a) |
此例執行結果如下
> python list_demo.py |
2 [2, 3] [2, 4] [2, 3, 4, 5] 4 [4, 5] True [1, 2, 3, 4, 5, 6, 7, 8] [1, 2, 3, 5, 6, 7, 8] [1, 2, 3, 5, 10, 7, 8] |
> |
有關用索引值處理子串列,官方取名為 slicing ,中文通常直譯為「切片」或「分片」,英文 slice 做名詞原意是一片一片的「片」,做動詞就是「切成片」。
串列可以用任意型態的資料當元素,這是說串列可以用串列當元素,這樣的串列叫做多維串列,例如以下示範二維串列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # 定義二維串列 a = [[1, 2, 3], [4, 5, 6]] # 印出索引值 1 的子串列中索引值 1 的元素 print(a[1][1]) # 重新設定元素 a[1][2] = 100 # 刪除元素 del a[0][2] # 印出元素 for i in a: for j in i: print(j, end=", ") print() # 檔名: list_demo2.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
二維串列需要用兩個中括弧處理元素,第一個中括弧是指最外層串列的元素索引值,第二個中括弧表示內層串列的元素索引值,這是說 a[1][1] 就是說串列變數 a 的第 2 個串列中的第 2 個元素。下面則是重新設定、刪除然後印出,此例執行結果如下
> python list_demo2.py |
5 1, 2, 4, 5, 100, |
> |
處理串列很常用到 for 迴圈 (loop) ,單元 23 - for 陳述介紹 for 迴圈的用法。
利用內建函數 (built-in function) list() 可以轉換其他序列為串列,以下 iterable 是可迭代的物件
操作 | 說明 |
---|---|
list([iterable]) | 依 iterable 建立列物件 |
單元 66 - 迭代器會介紹迭代器及如何定義迭代器,也會說明可迭代與迭代器的不同。
舉例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # 設定序對 a = (1, 2, 3, 4, 5) # 轉換續對為串列 b = list(a) print(b) # 設定字串 c = "12345" # 轉換字串為串列 d = list(c) print(d) # 印出 b 的長度 print(len(b)) # 印出 b 的最大值 print(max(b)) # 印出 b 的最小值 print(min(b)) # 檔名: list_demo3.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
單元 33 - 字串介紹如定義字串 (string) ,單元 38 - 序對與 Range介紹如定義序對 (tuple) 。
以上先將序對轉換成串列,然後再把字串轉換成串列,注意序對元素會直接變成串列,字串元素則是會切割成單一字元為串列的元素,底下也用內建函數 len() 取得串列的元素總數, max() 取得最大值, min() 取得最小值,此例執行結果如下
> python list_demo3.py |
[1, 2, 3, 4, 5] ['1', '2', '3', '4', '5'] 5 5 1 |
> |
這裡字元在 Python 指的是長度為 1 的字串,也就是只有一個符號的字串。
另一個內建函數 sorted() 可以替串列排序,然後回傳排序後的新串列,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 設定整數串列 a = [51, 42, 19, 76, 64] # 印出排序結果 print(sorted(a)) print(a) # 設定字串串列 b = ["g", ",", "a", "=", "n"] # 印出排序結果 print(sorted(b)) print(b) # 檔名: list_demo4.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
這個例子先替原串列排序,然後印出排序後的新串列,下一行印出原串列做比較,執行結果如下
> python list_demo4.py |
[19, 42, 51, 64, 76] [51, 42, 19, 76, 64] [',', '=', 'a', 'g', 'n'] ['g', ',', 'a', '=', 'n'] |
> |
字串排序是依每個字元的 Unicode 值。
參考資料
- https://docs.python.org/3/tutorial/introduction.html#lists
- https://docs.python.org/3/tutorial/datastructures.html#more-on-lists
- https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range