單元二・串列與迴圈

串列(list)

Python 執行環境載入中⋯⋯(第一次約需 10 秒,之後由瀏覽器快取)

前面提到變數為程式儲存資料的地方,一個變數可以儲存一個學生的成績、一個人的身高、或是一個人名等,但如果多人的資料要管理,為每個人設計一個變數顯然就有點不切實際,串列就是用來解決這樣的問題。

串列

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)的方式:

例如:

可以改改看,按執行

執行結果:

['新竹', '台中', '台南']
['台北', '桃園']
['新竹', '台中', '台南']
['桃園', '台中']
['台北', '桃園', '新竹', '台中', '台南']

和讀取單一元素不同,切片的範圍超出串列長度時不會產生錯誤,超出的部分會直接被忽略:

可以改改看,按執行

執行結果:

['台中', '台南']

串列的長度與檢查元素

既然讀取超出範圍的索引值會產生錯誤,在讀取之前知道串列有多少個元素就很重要了。len() 函數可以取得串列的長度,也就是元素的個數,因此最後一個元素的索引值就是 len(city) - 1。若只是想知道某個值在不在串列裡,則可以用 in 運算子,在串列裡就得到 True,反之為 False;not in 則剛好相反。

可以改改看,按執行
可以改改看,按執行

執行結果:

5
台南
True
False
True

修改串列元素

串列可指定索引值修改其內容:

可以改改看,按執行

執行結果:

['小明', 140, 50]

增加串列元素

當需要在串列後方增加串列元素時,若使用超出串列長度的索引值來修改串列的內容,程式會產生錯誤。

可以改改看,按執行

錯誤訊息的最後一行如下:

IndexError: list assignment index out of range

有幾種方法可以達成這個目標:

可以改改看,按執行

執行結果:

['台北', '桃園', '新竹', '台中', '台南', '宜蘭']
可以改改看,按執行

執行結果:

['台北', '桃園', '新竹', '台中', '台南', ['花蓮', '台東']]
['花蓮', '台東']
花蓮
可以改改看,按執行

執行結果:

['台北', '桃園', '新竹', '台中', '台南', '澎湖', '金門']

extend() 會把傳進去的東西一個一個拆開再加入,字串也會被拆成一個一個字。因此若要加入的是一個字串,應該用 append(),或是把字串放進串列裡再用 extend():

可以改改看,按執行

執行結果:

['台北', '桃園', '新竹', '台中', '台南', '宜', '蘭']
可以改改看,按執行

執行結果:

['台北', '桃園', '新竹', '台中', '嘉義', '台南']

直接修改原本串列的方法

注意串列相加的寫法需要 city = city + ["宜蘭"],把相加後產生的新串列指派回 city;而 append()、extend()、insert() 是直接修改原本的串列,它們的回傳值是 None。如果照著相加的習慣寫成 city = city.append("宜蘭"),city 就會被換成 None,原本的串列也就找不回來了:

可以改改看,按執行

執行結果:

None

刪除串列元素

可以改改看,按執行

執行結果:

['台北', '桃園', '新竹', '台中']
可以改改看,按執行

執行結果:

台南
['台北', '桃園', '新竹', '台中']
桃園
['台北', '新竹', '台中']
可以改改看,按執行

執行結果:

['台北', '桃園', '新竹', '台南']

若串列裡找不到指定的值,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 的箭頭指向同一個串列,「台中」加進去後兩個變數都看得到;下半:用切片複製產生了第二個串列,「台中」只加在 my_city 指向的那一個

不過這樣的複製只有外層,若串列裡還有串列,裡面的串列仍然是同一個,修改它一樣會影響原本的串列:

可以改改看,按執行

執行結果:

['台北', ['花蓮', '台東', '屏東']]

city 和 my_city 指向兩個不同的外層串列,但兩者的第二格都指向同一個內層串列,所以「屏東」兩邊都看得到city 和 my_city 指向兩個不同的外層串列,但兩者的第二格都指向同一個內層串列,所以「屏東」兩邊都看得到


這一章我們學會了建立串列、用索引值與切片讀取元素,以及增加、修改、刪除與複製串列元素的方法。遇到 IndexError 時,可以先用 len() 確認串列的長度,看看索引值是不是超出了範圍;串列的內容跟預期的不一樣時,則可以檢查是不是有兩個變數指向同一個串列。

本章程式碼