Python 初學第五講- list, tuple and set
在前面我們學了條件判斷以及迴圈等,可以使程式因應各種不同狀況來做出不同的動作。我們也學過了變數跟基本資料型態的用法,這一篇要來介紹的是複雜的資料型態 — list 、 tuple 、 set 。
如果曾經有學過 C 語言或是 C++等其他程式語言的話,不同語言通常都可以使用序列來記錄連續性的資料,例如 C 和 C++在儲存整數時,最常使用的就是陣列 ( Array )。 而在 Python 當中,所使用的是 list 和 tuple 來儲存連續性的資料。
串列 list
首先要來介紹的資料型態就是 list 。 list 可以用來儲存一連串有順序性的元素。例如我們想要產生一個名叫 thriller 的 list :
thriller = ['Thriller', 'Billie Jean', 'Beat It']我們會把想要儲存的元素放在 [] 兩個括號中,不同元素之間使用逗號來隔開。上面這行 code 代表我們創建了一個名叫 thriller 的 list,而在這個 list裏面包含了'Thriller’ 、 'Billie Jean' 、 'Beat it' 這幾個字串。
如果想要將這個 list 印出,結果如下,會印出 thriller 裡面所包含的字串。

如果想要知道這個 list 裡面有幾個元素,可以使用 len() 這個函式。

取得 list 裡面的元素
想要取得元素的話,可以在 list 的名稱後面使用方括號 [] 加上想取得元素的位置 ( index ),就可以取得想要的元素。
list[index]值得一提的是,程式語言中的 index 是從 0 開始的。所以如果想要取得第一個位置的元素,要輸入的位置值會是 0 ,想取得第二個元素則得輸入 1 ,以此類推。
例如,今天我們想要取得 'Billie Jean' 這個元素。'Billie Jean' 是 thriller 當中的第二個元素,要輸入的 index 是 1。
當輸入print(thriller[1]) 這行指令,就會印出 'Billie Jean' 了 !
thriller = ['Thriller', 'Billie Jean', 'Beat It']
print(thriller[1])
下面是印出 list 不同位置的結果。
可以看到 :thriller[0] 代表的是第一個字串 "Thriller" 、thriller[1] 代表的是第二個字串 "Billie Jean" ,thriller[2] 所代表的則是最後一個字串 "beat it" 。

取得 list 裡面的最後一個元素
如果想要取得 list 中的最後一個元素,除了前面輸入字串的 index 以外,也可以輸入 -1 。list[-1] 和 list[len(list)-1] 所代表的值是相同的。
thriller = ['Thriller', 'Billie Jean', 'Beat It']
print(thriller[-1])
由上圖可以看到, print(thriller[-1]) 的結果會是 "Beat It" 。
使用 -1 ,就可以不必知道整個 list 的長度,也能夠取得最後一個元素。
由於我們常常會更動 list 的內容及長度,以-1 來表示最後一個元素的話,就不必一直更改 index ,可以增加程式的一致性 (consistency) ,日後在更改或是維護的時候會更方便。
取到 list 裡面所沒有的元素 : list index out of range
在 thriller 這個 list 當中只有三個元素,代表可以取得的 index 只有 0 、1、2。如果試著取 index 為 3 的值會發生什麼事呢?
由下圖可以看到 ,如果輸入 print(thriller[3]) 的話,會出現錯誤 IndexError,這就代表我們不小心取到不存在的元素了。

如果使用 index 來表示最後一個元素,在程式的不斷增減 list 元素的同時,就會很容易發生 list index out of range 的錯誤,這也就是為什麼用 -1 來表示會比較好的原因啦~
以範圍取值
想要取得一連串範圍的值,使用的方式如下:
list[start(開始的index):end(結束的index):sep(間隔)]值得注意的是,取出來的值只會包含開頭,不會包含結束的 index。後面的間隔如果沒有特別輸入的話,初始值為 1。
以 thriller 這個例子來說,如果想要取得 index 為 0, 1, 2 的值,程式碼如下:
thriller = ['Thriller', 'Billie Jean', 'Beat It','Human Nature','PYT']
print(thriller[0:3])
print(thriller[3]
輸入print(thriller[0:3]) 所得到的結果,會是 "Thriller" 、 "Billie Jean" 及 "Beat It" ,也就是 index 為 0、 1、 2 的元素。
並不會包含索引值是 3 的值。
以範圍取值的更多表示方法
如果輸入 list[:end] 、也就是省略輸入索引值起點,初始會從 0 開始。
所以輸入 list[:2] 和 list[0:2] 的結果會是一樣的。
至於 list[start:] 省略輸入終點的話,Python 會假設你想要取到最後一個值,所以輸入 list[2:0] 和 list[2:] 的結果也會一樣。
thriller = ['Thriller', 'Billie Jean', 'Beat It','Human Nature','PYT']
print(thriller[:3])
print(thriller[2:])
如上面的例子所示, print(thriller[:3]) ,會印出 index 從 0 開始、到 3 結束(不包含 3 )的元素。
print(thriller[2:]) 則得到 index 從 2 開始,一直到結束的元素。
增加 list 裡面的元素
1. append method
想要增加 list 裡面的元素,可以使用 append 這個方法( method )來將新的元素增加到 list 的最後。
list.append(value)以 thriller 的例子來說,若想要在這個代表著專輯的 list 當中加入
“That Girl is Mine” 這首歌的話,就可以使用 list 的 append method。
輸入thriller.append('That Girl is Mine') ,就會在這個 list 的最後加入這首歌了。
thriller = ['Thriller', 'Billie Jean', 'Beat It']
thriller.append('That Girl is Mine')
print(thriller)下圖可以看到,thriller 的最後面被加上了 “That Girl is Mine”。

2. insert method
如果想要指定所增加物件的位置呢 ? 可以使用 list 的另一個方法 (method) insert 來指定位置。
list.insert(position, object)用法是list.insert(位置, 物件) ,在括號後面第一個值代表的是想要插入的位置,後面則是想要加入的東西本身。
拿上面 append 曾使用過的 thriller 例子來說,把 append 換成 insert,並且指定插入的索引值是 1。程式碼如下 :
thriller = ['Thriller', 'Billie Jean', 'Beat It']
thriller.insert(1,'That Girl is Mine')
print(thriller)可以看到新加入的 'That Girl is Mine' 被排在 list 中的第二個,也就是索引值 index 為 1 的位置。

3. extend method
如果一次想加入很多個值、或是想將某個 list 中的元素加到另一個 list 的時候,可以用 extend 這個方法。
list_1 = [object1, object2, object3]
list_2 = [object4, object5]
list_1.extend(list_2)使用 insert method 跟 append method 會碰到的狀況如下 :
bad_1 = ['Bad', 'Smooth Criminal','Speed Demon']
bad_2 = ['Man in the Mirror', 'Dirty Diana']
bad_1.insert(1, bad_2)
print(bad_1)如下圖結果所示,如果想用 insert method 把 bad_2 這個 list 加到 bad_1 中整合,可以看到 bad_2 的確是被加進 bad_1 中了沒錯,不過是以整個 list (the list itself )的資料型態被塞入的,而不是以元素的形式被加入。

要把第二個 list 中的元素 (而不是整個 list) 加到第一個 list 中的做法,就是改成使用 extend method。
bad_1 = ['Bad', 'Smooth Criminal','Speed Demon']
bad_2 = ['Man in the Mirror', 'Dirty Diana']
bad_1.extend(bad_2)
print(bad_1)結果如下圖,可以看到透過用 extend method,成功將 bad_2 中的歌曲以元素的形式( each and individual item)整合到 bad_1 中。

移除 list 中的元素
1. remove method
想要移除一個 list 中的元素,可以使用 remove method。
list.remove(object)在 remove 後面的括號中輸入想要移除的元素,即可移除。
下面的例子,我們想要將 "Smooth Criminal" 這首歌從 bad 清單中刪去。
bad = ['Bad','Smooth Criminal','Speed Demon','Man in the Mirror','Dirty Diana']
bad.remove('Smooth Criminal')
print(bad)結果如下 ,可以看到 “Smooth Criminal” 被刪了。 (QQ)

2. pop method
如果單純只是想要移除這個 list 的最後一個元素的話,可以用 pop method。
list.pop()在括號後面不放任何東西的話, 預設 list 中的最後一個 element 會被移除,且會回傳所移除的那個值。
bad = ['Bad','Smooth Criminal','Speed Demon','Man in the Mirror','Dirty Diana']
popped = bad.pop()print(bad)
print(popped)
如程式碼所示,我們在使用 pop method 的時候,產生一個變數 popped,讓這個變數等於 bad.pop() 所回傳的值。
印出 bad 時可以看見, bad 的最後一個元素 “Dirty Diana”已經被移除了;而印出 popped 變數可以看到那正是前面被移除的 “Dirty Diana”。

pop method 對於想要把 list 當作特定資料結構使用來說非常方便 (例如 stack 跟 queue)。
list 的排序
1. 反轉 list
如果想要將當前的 list 反轉的話,可以使用 reverse method。
list.reverse()下面以 bad 這個清單為例,list 使用 reverse method 後,會照當前的順序反轉。
bad = ['Bad','Smooth Criminal','Speed Demon','Man in the Mirror','Dirty Diana']
bad.reverse()
print(bad)原本以”Bad” 為首、”Dirty Diana “在最後,用過 reverse method 後結果如下 :

2. 排序 list
若想要排序 list 的話,則有 sort method。
list.sort()sort 括號中可以設定排序的條件。
(1). 初始設定
若括號中什麼都不加的話,字串會照字母順序排列、數字則會是遞增排列。
以 bad 這個 list 為例,使用過 sort method 的 element 會依字母順序排列。
bad = ['Bad','Smooth Criminal','Speed Demon','Man in the Mirror','Dirty Diana']
bad.sort()
print(bad)結果如下 :

若 list 的清單中元素的資料型態為整數或浮點數,則會遞增排列。
num = [23, 4, 53, 5 ,35, 6]
num.sort()
print(num)結果如下 :

(2). 倒轉排序
如果想要數字遞減排列、或是依照字母順序的反向排列呢 ?
list.sort(reverse = True)在括號中加上 reverse = True 的條件設定就能達到 !
可以自己在 Jupyter Notebook 上試試看。


3. 在不更動原 list 的情況下產生一個排序過的 list
在上面使用 sort method 時,你可能已經發現,原本的整個 list 會被更動排序。很多時候我們會想要保存完整的資料、不想輕易更改,但同時又需要有被整理過的資料。此時便可以使用 sorted 這個函數。
list
sorted_list = sorted(list)我們使用 sorted() 來取得排序過的資料,
然後另外產生一個變數 sorted_list 來儲存這個資料,這樣原本的 list 就不會被更動到啦~
list 的極值與查找
1. list 的極大、極小值與總和
想要直接取得 list 中的極值, 可以用 max() 、 min() 這兩個函數。
#極大值
max(list)#極小值
min(list)
若想知道 list 中各元素的總和,則有 sum() 這個函數。
sum(list)例子如下 :
num = [23, 4, 53, 5 ,35, 6]
print(max(num))
print(min(num))
print(sum(num))程式便會很有效率地印出極大極小值、以及這個 list 所有數字的總和了。

