# Python 串列 (List)
> 作者:王一哲
> 第1版:2021年10月21日
> 第2版:2023年7月11日,修改增加元素、插入元素的文章內容
> 第3版:2023年8月5日,新增二維串列及進階技巧
串列 (list) 是在 Python 當中儲存大量資料的其中一種格式,以方括號 \[\] 將資料包起來,我們通常將每一筆資料稱為元素 (element),每一個元素所在的位置為索引值 (index),Python 與 C、C++ 的作法相同,索引值皆從 0 開始。以下是串列的基本性質及操作方式。
<br /><br />
## 建立串列
如果要建立一個變數名稱為 a 的空串列可以這樣做
```python
a = []
```
串列中可以儲存各種格式的資料,例如數值、字元、字串。如果要在建立的串列時同時設定各個元素的值可以這樣做
```python
a = [0, 1, 2, 3, 4]
b = ['a', 'b', 'c', 'd', 'e']
c = ['a', 'bc', 'def', 'ghij', 'klmno']
d = [0, 'b', 2, 'd', 5]
```
同一個串列各個元素可以是不同類型的資料,這點與 C、C++ 不一樣。
<br /><br />
## 取出元素
如果要取出串列中的某個元素,可以用索引值處理,例如要取出串列 b 中索引值為 1 的元素寫法為
```python
b[1]
```
輸出為
```python
'b'
```
<br />
如果要取出串列 b 中索引值為 0 到 4 (不包含4) 的元素寫法有兩種
```python
b[0:4]
b[:4]
```
輸出為
```python
['a', 'b', 'c', 'd']
```
<br />
如果要在串列 b 中每隔 2 個元素取出索引值為 0 到 4 (不包含4) 的元素,寫法為
```python
b[0:4:2]
```
輸出為
```python
['a', 'c']
```
<br />
如果要取出串列 b 中索引值為 1 到最後一個元素的寫法為
```python
b[1:]
```
輸出為
```python
['b', 'c', 'd', 'e']
```
<br />
如果要取出串列 b 的最後一個元素寫法為
```python
b[-1]
```
輸出為
```python
'e'
```
<br />
如果要取出串列 b 倒數第二個元素的寫法為
```python
b[-2]
```
輸出為
```python
'd'
```
<br />
如果要將串列 b 倒著輸出,寫法為
```python
b[-1::-1]
```
輸出為
```python
['e', 'd', 'c', 'b', 'a']
```
<br />
## 於串列後方增加元素
如果在串列 b 的最後面附加 1 個元素 'f',通常使用的寫法為
```python
b.append('f')
```
第二種寫法為
```python
b += ['f']
```
操作後串列 b 變為
```python
['a', 'c', 'd', 'e', 'f']
```
<br />
第二種寫法的好處在於可以一次增加多個元素,例如
```python
b += ['g', 'h', 'i']
```
操作後串列 b 變為
```python
['a', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
```
<br />
第三種寫法是利用 **開箱運算子** (unpacking operator) \*,例如
```python
b = [*b, 'g', 'h', 'i']
```
操作後串列 b 變為
```python
['a', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
```
<br /><br />
## 於指定的索引值插入元素
最方便的作法是使用 insert。假設串列 b 的內容為
```python
['a', 'b', 'c', 'd', 'e']
```
如果要在索引值為 2 處插入字串 z,語法為
```python
b.insert(2, 'z')
```
串列 b 變為
```python
['a', 'b', 'z', 'c', 'd', 'e']
```
<br /><br />
## 於串列前方插入元素
假設串列 b 的內容為
```python
['a', 'b', 'c', 'd', 'e']
```
如果要在串列開頭處加入字串 z,串列原來的元素索引值都加1,至少有以下三種寫法。第一種寫法是利用 insert
```python
b.insert(0, 'z')
```
第二種寫法是利用 +
```python
b = ['z'] + b
```
第三種寫法是利用 **開箱運算子** (unpacking operator) \*
```python
b = ['z', *b]
```
以上三種寫法都會將串列 b 變為
```python
['z', 'a', 'b', 'c', 'd', 'e']
```
<br /><br />
## 刪除元素
假設串列 b 的內容為
```python
['a', 'b', 'c', 'd', 'e']
```
如果要取出串列 b 中索引值為 1 的元素,第一種寫法為
```python
del(b[1])
```
請注意,**這個寫法沒有回傳值**,只會刪除指定的元素,因此串列 b 變為
```python
['a', 'c', 'd', 'e']
```
<br />
第二種寫法為
```python
e = b.pop(1)
```
請注意,**這個寫法有回傳值**,我們是將從串列 b 中刪除的元素回傳給變數 e,因此串列 b 變為
```python
['a', 'c', 'd', 'e']
```
變數 e 的值為
```python
'b'
```
pop 預設會回傳串列中的最後一個元素,因此
```python
e = b.pop()
```
會將串列 b 變為
```python
['a', 'b', 'c', 'd']
```
<br /><br />
## 複製串列
假設串列 b 的值為
```python
['a', 'b', 'c', 'd', 'e']
```
如果要狀串列 b 複製的串列 c,有些人會想要用指定的寫法
```python
c = b
```
但這個寫法是將串列 b 指定給串列 c,如果改變了串列 c 的值,串列 b 會跟著改變,例如
```python
c[0] = 'b'
```
則串列 b、c 皆變為
```python
['b', 'b', 'c', 'd', 'e']
```
<br />
因此比較好的寫法是
```python
c = b.copy()
```
這個會將串列 b 的值複製給串列 c,如果再改變這兩個串列的值,則不會影響到另一個串列。
<br /><br />
## 二維串列
如果串列中的元素是一維串列就稱為二維串列,可以先建立一個空的串列,再用 append 加入一維串列;也可以在建立串列時直接指定資料。例如以下的程式碼,a 是先建立空的串列再用 append 加入一維串列,b 是建立串列時直接指定資料,兩都的內容都是 [[0, 1, 2], [3, 4, 5]]。由於二維串列看起來很像數學中的矩陣,通常會沿用矩陣的講法,將 [[0, 1, 2], [3, 4, 5]] 這樣的二維串列稱為 2 列 (row)、3 欄 (column)。
```python
a = []
a.append([0, 1, 2])
a.append([3, 4, 5])
b = [[0, 1, 2], [3, 4, 5]]
```
但是 Python 的二維串列與 C++ 的陣列 (array) 不同,每一列當中資料數量可以不一樣,例如以下的程式碼。
```python
c = [[0], [1, 2], [3, 4, 5], [6, 7, 8, 9]]
```
理論上可以産生三維以上的串列,但是這樣不容易想像資料的結構及位置,因此通常只使用一維及二維串列。
<br /><br />
## 進階技巧
### 産生資料相同、指定長度的一維串列
語法為
```python
串列名稱 = [資料]*長度
```
例如
```python
a = [0]*5 # a 的內容為 [0, 0, 0, 0, 0]
b = [1]*5 # b 的內容為 [1, 1, 1, 1, 1]
c = [-1]*5 # c 的內容為 [-1, -1, -1, -1, -1]
```
<br /><br />
### 産生資料為等差數列的一維串列
通常有兩種方法,基本的方法是先産生一個空的串列,再於 for 迴圈中用 append 加入資料,例如以下的程式碼
```python
a = []
for i in range(10):
a.append(i)
```
比較偷懶的方法是將 for 迴圈包在同一行當中,例如以下的程式碼
```python
b = [i for i in range(10)]
```
也可以用 list 將 range 産生的數值轉成串列,例如以下的程式碼
```python
c = list(range(10))
```
以上三種方法得到的一維串列內容都是 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]。
我們也可以利用 range 的特性,産生內容為 [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 的一維串列,例如以下的程式碼
```python
d = [i for i in range(9, -1, -1)]
e = list(range(9, -1, -1))
```
<br /><br />
### 印出串列內容,以空格分隔資料
由於許多題目要求印出答案時,要用空格分隔資料,但是最後一筆資料後方不加空格、直接換行,不能直接用 print 印出串列內容。通常有3種方法,基本的方法如下
```python
a = [i for i in range(10)]
for i in range(len(a)):
if i == len(a)-1:
print(a[i])
else:
print(a[i], end=" ")
```
比較偷懶的方法是將 if、else 於在 print 同中,例如以下的程式碼
```python
for i in range(len(a)):
print(a[i], end="\n" if i == len(a)-1 else " ")
```
更偷懶的方法是利用**開箱運算子 (unpacking operator)**
```python
print(*a)
```
以上3個方法輸出皆為
```python
0 1 2 3 4 5 6 7 8 9
```
<br />
同樣的方法也可以用在印出二維串列,例如以下的程式碼
```python
c = [[0], [1, 2], [3, 4, 5], [6, 7, 8, 9]]
for i in range(len(c)):
for j in range(len(c[i])):
print(c[i][j], end="\n" if j == len(c[i])-1 else " ")
# 比較偷懶的寫法
for r in c: print(*r)
```
輸出為
```python
0
1 2
3 4 5
6 7 8 9
```
<br /><br />
---
###### tags:`Python`