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 值。

參考資料

上一頁 單元 38 - 序對與 Range
回 Python 簡易手冊 首頁
下一頁 單元 40 - 串列方法
回 Python 教材首頁
回程式語言教材首頁