Python必備基礎 —python list and tuple串列與元組
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來儲存複數的資料。未來有機會,再來說明這個部分。