---
# System prepended metadata

title: Python 串列 (List)
tags: [Python]

---

# 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`
