Python必備基礎 —python list and tuple串列與元組

Sean Yeh
Python Everywhere -from Beginner to Advanced
13 min readJul 14, 2021

--

Naree Budjong Djara National Park ,Brisbane, Australia, photo by Sean Yeh

Python資料型態包括先前提過的數值型別、邏輯(布林)型別、字串型別外,還有串列(List)、元組(Tuple)、字典(Dictionary)與集合(Set)等類型,在這些類型,是Python的複合式資料型態。

前面的資料類型是屬於Python的基本型,如果用原子來比喻這種基本類型的話,接下來要討論的串列、元組、字典與集合等類型就像是分子。這些複合式資料型態,比前面的類型要複雜多。其中,字典類型已經在之前的文中談過,這一篇要來探討的是串列與元組型態。

List (串列)與Tuple (元組)

以前學過如何用一個變數紀錄一個值,但是若資料為複數時,是否也可以用一個變數表示?在Python中有兩種序列性的結構,串列(List)與元組(Tuple)。這種結構可以一次將多個資料放入一個變數裡面。

串列List,又稱為清單或列表,類似於其他語言中的陣列(Array)。它的角色是用來儲存大量有序資料的記憶空間。串列很適合用來追蹤東西的順序。

元組Tuple的使用方式與list很像。許多用於List的操作方式及方法都可以應用在Tuple上。既然如此,那麼為什麼在已經有List的狀況下還要特別創造出Tuple這種型態?

因為Tuple是不可變的,當你指定一個元素給tuple之後,就再也不可以更改了。反之,List串列則是可以任意改變的。當指定元素給串列之後,你可以任意的加入新元素或刪除、改寫既有的元素。因此,你會發現,在大部分關於序列性資料結構的討論中,大都會把焦點集中在串列上。

List (串列)的建立

串列是由零個或多個元素組成,元素與元素間以逗號分隔。在建立串列的時候,只要在要儲存的元素資料兩側加上中括號([ ])就可以了。

其語法如下:

變數名稱 = [值1,值2,值3,值4,值5,...]

例如,我們想要把五個數字(2、4、6、8、10)指定給my_list串列時,可以用下面方式表示:

my_list = [2,4,6,8,10]

我們可以使用type()來檢查看看my_list的型態。

可以得到它是一個list串列(<class ‘list’>)。

如果要建立空白串列,可以使用 list() 來建立。

an_empty_list = list()

或者是使用 [] 建立:

an_empty_list = []

轉換他類型為串列

list函式可以將其他的資料類型轉換成串列。若想要把一組字串拆成串列,可以使用list()來達成。

我們可以使用list()把一句英文字串拆成字母所組成的串列。例如:可以用list(message)將字串message拆成串列。

message ="Hello World"list(message)

執行結果如下:

如果覺得上面的敘述有些抽象的話,我們也可以將串列想像為具有一格一格特徵的一個書架,或是五斗櫃。當我們將數字或者是字串等資料依序放入串列中的時候,資料會依照放置的先後順序依序擺放在櫃子中。

用Python程式碼表示的話,看起來會是這個樣子。

my_numbers = [10,20,30,50,100]my_strings = ["John","Mary","Alice","Cindy","Willian"]

您也可以試著印出來看看。

print(my_numbers)print(my_strings)

因此,我們可以說串列是一個容器,容器內搜集的值被稱為元素。

串列中可以放不同型別的值

從前面的說明看來,串列是一個可以放入以個以上「值」的容器。而這個容器裡面的「值」是否有限制?

實際上,在一個串列內的元素不必放入一樣型別的元素值。在串列裡面,我們可以同時放入字串、數字或者是布林值,甚至於可以在串列中,放入另外一個串列當作元素,這種串列又稱作「多維串列」。

多維串列:串列的串列

以下的程式碼顯示出在一個串列中,可以再放入另外一個串列當作元素。

data = ['apple','banana',['pineapple',5,True]]

又如下面五個變數:p01到p05。若將這五個變數放入fruits變數中:

p01 = ['apple', 5]p02 = ['banana', 10]p03 = ['orange', 3]p04 = ['pineapple', 4]p05 = ['mango', 7]fruits = [p01, p02, p03, p04, p05]fruits

就會得到(串列的串列)下面的結果:

[['apple', 5], ['banana', 10], ['orange', 3], ['pineapple', 4], ['mango', 7]]

要取出串列中的個別串列值,只要在原來的索引值後面再多加一個索引值即可。例如:取出多維串列中的第一個元素時,可以使用下面的方式:

fruits[0][0]

事實上,每一個元素都是Python物件,因此你可以任意的創造各種複雜的結構。

從串列中取出資料

如果想要將串列中的一個項目取出的話,該如何?

index取得一個項目

這時我們可以透過元素對應的索引(index),來取出單獨的元素。語法如下:

list[索引]

其中,索引值從0開始,第一個索引值為0,第二個索引值為1,依此類推。也就是說若要取出第一個項目時需要採用list[0]的方式表示。

以前面的五斗櫃的例子來說,如果想要取出櫃子裡第一層的資料,需要指定櫃子上面編號為0的櫃位。也就是櫃子名稱[櫃位編號]的概念。

接下來我們實際上以程式碼操作看看。例如這裡有一個串列my_list。

my_list = [2,4,6,8,10]

由於我們可以透過元素對應的索引(index),來取出單獨的元素。因此,當我們取my_list[0]時,其結果為2,取my_list[1]時,其結果為4。

my_list[0] # 2
my_list[1] # 4
my_list[2] # 6
my_list[3] # 8
my_list[4] # 10

如果要從串列的最後一個項目開始取出值的話,可以使用負數當作索引。例如,要取出串列中最後一個項目時,要使用-1、要取出串列中倒數第二個項目,要使用-2。

若填入的索引值超出串列的資料範圍,導致找不到串列的對象時,會產生IndexError的錯誤。舉例來說,若針對前面的my_list串列,要取出索引為5的值:

my_list[5]

就會出現IndexError: list index out of range的錯誤。

slice取得多個項目

在串列中若需要取出多個項目,可以使用切片(slice)的方式從串列中取出一部分的元素。語法如下:

list[起點:終點:間隔]

起點的預設值為0,終點的預設值為最後的索引,間距預設值為1。如果參數省略,會直接套用預設值。

Slicing的操作

下面示範幾個透過切片操作串列的方式。先假設有下面串列days:

days = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]

取出前三項

如果想要取出串列中的前三個項目的話,我們可以用下面方式:

days[0:3]

您可以得到下面的結果:

['星期一', '星期二', '星期三']

你會發現當我們要取出0到3的索引時,只取出了索引0、索引1與索引2的值,最後一個索引值(索引3)並不包括在內。

取出前四項

同理得知,若要取出串列中的前四個項目,我們可以用下面方式:

days[0:4]

您可以得到下面的結果:

['星期一', '星期二', '星期三', '星期四']

我們取出了索引0、索引1、索引2與索引3的值。

取出全部項目

如果您要透過slice取出串列中全部的內容,可以用下面方式:

days[:]

您可以得到下面的結果:

['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']

取出第一個到倒數第二個項目

若要取出從第一個項目一直到倒數第二個項目時,可以用下面方式:

days[0:-1]

您可以得到下面的結果:

['星期一', '星期二', '星期三', '星期四', '星期五', '星期六']

取出第一個到倒數第三個項目

同理,若要取出從第一個到倒數第三個項目時:

days[:-2]

會得到下面的結果:

['星期一', '星期二', '星期三', '星期四', '星期五']

取出倒數第三個到最後一個項目

若要取出從倒數第三個項目到最後一個,可以使用下面方式:

days[-3:]

會得到下面的結果:

['星期五', '星期六', '星期日']

將資料加入串列

append方法

append可以將項目值加到串列結尾,也就是加在串列「最後面」的位置。並且一次只能增加一個值。

list.append(增加的值)

例如,我們可以將1000加入my_numbers串列中:

my_numbers = [10,20,30,50,100]my_numbers.append(1000)print(my_numbers)

由於append只能將項目加到串列的結尾。如果您需要將項目加在串列的「某一個」位置時,就需要用到下面的insert方法。

insert方法

這個方法可以將一個元素加到串列的任何位置。不過,需注意索引值不可以超過串列元素的個數。例如在我們的my_numbers中加入值:

my_numbers = [10,20,30,50,100]

我們透過insert方法:

my_numbers.insert(3, 11)

得出來的結果是:

[10,20,30,11,50,100]

insert參數的第一個值是索引值,第二個則是要插入串列的值。

修改串列中的一個項目

就如同使用索引值來取出串列中的某個項目一樣,我們也可以利用同樣的方式來修改串列中某個項目的的值。同樣舉my_numbers串列為例:

my_numbers = [10,20,30,50,100]

若想要修改第三個項目的值(索引值為2),我們可以透過下面方式:

my_numbers[2] = 80

結果,串列為:

[10,20,80,50,100]

原來的30被修改為80了。

刪除串列中的一個項目

del

使用del並且配合索引值,可以刪除串列中的一個項目。

del list[索引]

同樣舉my_numbers串列為例:

my_numbers = [10,20,30,50,100]

如果要刪除最後一個項目,可以透過下面方式:

del my_numbers[-1]

產生的結果如下:

注意:del不是串列的方法。因此不可以使用list.del()的方式處理。

如果想要一次刪除多個項目,可以將索引換成slice切片。例如:

del my_numbers[1:3]

remove方法

如果不確定該項目在串列中的哪一個位置,可以使用remove方法來刪除項目。其語法為:

list.remove(值)

如此可以刪除串列list中符合remove括號中間填入的值。

換一個例子my_strings:

my_strings = ["John","Mary","Alice","Cindy","Willian"]

假設我們要刪除Alice這個項目,但是並不知道Alice在串列中的哪個索引為值。這時候可以透過remove來刪除。

my_strings.remove("Alice")

pop方法

可以使用pop方法取得並移除串列中的一個項目。如果使用了索引值,就會傳回該項目,並且刪除串列中的項目。例如my_strings的例子:

my_strings = ["John","Mary","Alice","Cindy","Willian"]

假設我們使用pop方法取出最後一個值Willian(括弧中空白時,會取出串列中的最後一個值)。這時候,原來的my_strings串列中,就不存在該值(Willian)了。

Tuple 元組的使用方式

Tuple使用()小括號作為紀錄。語法為:

(元素 1,元素 2,元素 3,元素 4,元素 5,...)

建立Tuple

使用()可以建立空白元組。例如:

empty_tuple = ()

例如,建立一個name_tuple。需要在每個項目後面加上一個逗號包括最後一個項目。

name_tuple = 'John', 'Mary', 'Alice', 'Cindy',

執行結果如下:

轉換為Tuple

與串列類似,透過tuple()可以將其他的東西轉換為tuple。

結論

由於串列的應用非常廣泛,在撰寫Python的大部分時間裡,你會常常看到程式碼中list串列的影子。

串列除了前面說明的操作外,還有許多進階的方式,下面列出常用的方法:

另外,由於tuple物件佔記憶體的空間小,並且具備一但建立,就不可以修改的特性,在程式撰寫的過程中,有時候我們會採用tuple而不是list來儲存複數的資料。未來有機會,再來說明這個部分。

--

--

Sean Yeh
Python Everywhere -from Beginner to Advanced

# Taipei, Internet Digital Advertising,透過寫作讓我們回想過去、理解現在並思考未來。並樂於分享,這才是最大贏家。