Python 初學第五講- list, tuple and set

Alexander
Alexander
Sep 6, 2018 · 13 min read

在前面我們學了條件判斷以及迴圈等,可以使程式因應各種不同狀況來做出不同的動作。我們也學過了變數跟基本資料型態的用法,這一篇要來介紹的是複雜的資料型態 — listtupleset

如果曾經有學過 C 語言或是 C++等其他程式語言的話,不同語言通常都可以使用序列來記錄連續性的資料,例如 C 和 C++在儲存整數時,最常使用的就是陣列 ( Array )。 而在 Python 當中,所使用的是 listtuple 來儲存連續性的資料。

串列 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 以外,也可以輸入 -1list[-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 )的資料型態被塞入的,而不是以元素的形式被加入。

可以看到 “Man in the Mirror”及”Dirty Diana” 兩個元素又被一個中括號所框住,代表的是一個物件。

要把第二個 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 中。

使用extend method之後,第二個 list 的元素被加入第一個 list中。

移除 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 所有數字的總和了。

    Alexander

    Written by

    Alexander

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade