前面提到變數為程式儲存資料的地方,一個變數可以儲存一個學生的成績、一個人的身高、或是一個人名等,但如果多人的資料要管理,為每個人設計一個變數顯然就有點不切實際,串列就是用來解決這樣的問題。
Python 的串列可以包含相同型別的元素,例如記錄一個國家的城市,也可以包含不同型別的元素,例如記錄一個人的姓名、身高、體重等個人資料。
執行結果:
['台北', '桃園', '新竹', '台中', '台南']
['小明', 140, 45]
我們可以利用串列的索引值(index)來讀取串列的內容,Python 的串列索引是標記相對於第一個元素的位置,因此第一個元素的索引值為 0、第二個元素的索引值為 1,以此類推。此外,若索引值是 -1,代表的是串列的最後一個元素、若索引值是 -2,代表的是串列的倒數第二個元素,以此類推。
執行結果:
小明
140
45
45
140
小明
student 只有 3 個元素,索引值的範圍是 0 到 2(或 -1 到 -3),若讀取超出這個範圍的索引值,程式會產生錯誤:
錯誤訊息的最後一行如下:
IndexError: list index out of range
若要同時取得串列中的多個元素,可用串列切片(slice)的方式:
list[a:b]:取得串列索引值為 a 到 b - 1 的元素list[:a]:取得串列前 a 個元素list[a:]:取得串列索引值為 a 到最後一個元素list[a:b:c]:以 c 為間隔取得串列索引值為 a 到 b - 1 的元素list[:]:取得串列所有元素例如:
執行結果:
['新竹', '台中', '台南']
['台北', '桃園']
['新竹', '台中', '台南']
['桃園', '台中']
['台北', '桃園', '新竹', '台中', '台南']
和讀取單一元素不同,切片的範圍超出串列長度時不會產生錯誤,超出的部分會直接被忽略:
執行結果:
['台中', '台南']
既然讀取超出範圍的索引值會產生錯誤,在讀取之前知道串列有多少個元素就很重要了。len() 函數可以取得串列的長度,也就是元素的個數,因此最後一個元素的索引值就是 len(city) - 1。若只是想知道某個值在不在串列裡,則可以用 in 運算子,在串列裡就得到 True,反之為 False;not in 則剛好相反。
執行結果:
5
台南
True
False
True
串列可指定索引值修改其內容:
執行結果:
['小明', 140, 50]
當需要在串列後方增加串列元素時,若使用超出串列長度的索引值來修改串列的內容,程式會產生錯誤。
錯誤訊息的最後一行如下:
IndexError: list assignment index out of range
有幾種方法可以達成這個目標:
執行結果:
['台北', '桃園', '新竹', '台中', '台南', '宜蘭']
append() 方法,將新的元素或串列加到串列的尾端。若為串列,則加入後會以串列的形式存在,也就是串列中有元素是串列。要讀取這個串列裡的元素,可以連續使用兩次索引值,例如 city[5][0] 是先取出索引值為 5 的串列,再取出它索引值為 0 的元素。執行結果:
['台北', '桃園', '新竹', '台中', '台南', ['花蓮', '台東']]
['花蓮', '台東']
花蓮
extend() 方法,將新的串列加到串列的尾端。和 append() 不同的是,串列會拆解為元素一一加入串列的尾端。執行結果:
['台北', '桃園', '新竹', '台中', '台南', '澎湖', '金門']
extend() 會把傳進去的東西一個一個拆開再加入,字串也會被拆成一個一個字。因此若要加入的是一個字串,應該用 append(),或是把字串放進串列裡再用 extend():
執行結果:
['台北', '桃園', '新竹', '台中', '台南', '宜', '蘭']
insert() 方法,將新的元素或串列插入指定的位置。執行結果:
['台北', '桃園', '新竹', '台中', '嘉義', '台南']
注意串列相加的寫法需要 city = city + ["宜蘭"],把相加後產生的新串列指派回 city;而 append()、extend()、insert() 是直接修改原本的串列,它們的回傳值是 None。如果照著相加的習慣寫成 city = city.append("宜蘭"),city 就會被換成 None,原本的串列也就找不回來了:
執行結果:
None
del 將串列中指定的元素刪除。執行結果:
['台北', '桃園', '新竹', '台中']
pop() 將串列中指定的元素刪除,並回傳刪除的元素;若沒有指定,則會刪除串列中最後一個元素。執行結果:
台南
['台北', '桃園', '新竹', '台中']
桃園
['台北', '新竹', '台中']
remove() 將串列中第一個等於指定元素的值刪除。執行結果:
['台北', '桃園', '新竹', '台南']
若串列裡找不到指定的值,remove() 會產生錯誤,可以先用 in 檢查這個值在不在串列裡再刪除:
錯誤訊息的最後一行如下:
ValueError: list.remove(x): x not in list
前面增加與刪除元素的方法,都是直接修改原本的串列,因此把串列指派給另一個變數時要特別注意:my_city = city 並不會複製出一個新的串列,而是讓兩個變數指向同一個串列,所以透過 my_city 加入元素,city 也會跟著改變。
執行結果:
['台北', '桃園', '新竹', '台中']
若要得到一個可以獨立修改的串列,可以用前面切片提到的 city[:],它取得串列所有元素後會產生一個新的串列;也可以寫成 city.copy(),效果相同。
執行結果:
['台北', '桃園', '新竹']
['台北', '桃園', '新竹', '台中']
上半:city 和 my_city 的箭頭指向同一個串列,「台中」加進去後兩個變數都看得到;下半:用切片複製產生了第二個串列,「台中」只加在 my_city 指向的那一個
不過這樣的複製只有外層,若串列裡還有串列,裡面的串列仍然是同一個,修改它一樣會影響原本的串列:
執行結果:
['台北', ['花蓮', '台東', '屏東']]
city 和 my_city 指向兩個不同的外層串列,但兩者的第二格都指向同一個內層串列,所以「屏東」兩邊都看得到
這一章我們學會了建立串列、用索引值與切片讀取元素,以及增加、修改、刪除與複製串列元素的方法。遇到 IndexError 時,可以先用 len() 確認串列的長度,看看索引值是不是超出了範圍;串列的內容跟預期的不一樣時,則可以檢查是不是有兩個變數指向同一個串列。