Python列表選取
 課程目錄
 編輯章節
 EDU-MD
 Google 教室
 加至書籤

Python列表選取

在上一個章節中,我們學會了一些列表的基本知識,以及如何建立一個列表。在學會建立列表後,現在讓我們來討論要如何使用列表—如何將列表中的值選許出來。

從 0 開始的編碼

在建立一個列表後,我們常常需要運算列表中的單一項目,此時,列表的編碼就是一個不可或缺的東西了。簡單來說,在建立一個列表後,列表中的每一個項目都會被賦予一個索引值index)。讓我們看看這個例子:

>>> a = [27, 31, 54]

建立這個列表 a 後,列表 a 中的每個值都有了自己的索引值。這個索引值,從 0 開始,自列表的左邊至右邊依序遞增。也就是說,在列表 a 中,27 的編號是 0,31 的編號是 1,而 54 的編號就是 2。

這裡,一定要特別注意的是:列表的編號是從 0 開始的,而不是 1。像這種從 0 開始的編號方法,叫做 zero-based indexing,目前我們常見到的大部分程式語言,都是使用這種編號方法哦!

[x] 選取

現在,我們知道列表中的每個項目都會有自己的索引值了,但是我們不知道的是,要如何使用這些索引值來獲得列表中的單一項目。要達成這個目標其實相當的簡單,讓我們回想一下剛才的列表 a:

>>> a = [27, 31, 54]

我們已經知道,列表 a 中的 0、1、2 位置分別代表著 27、31、54 這三個值了,那麼,假設我們今天要印出 54 這個數字,要怎麼寫程式呢?我們可以這樣做:

>>> print(a[2])
54

有沒有看到上面發生了什麼事呢?我們在 a 的後面加上了一對中括號 [],並且在中括號之間加上了索引值。在這個例子中,我們所印出的是 a 列表中索引值為 2 的項目,也就是印出 54 的意思。

在這邊,我們得到一個很重要的結論:在列表後面加上中括號 [],可以用來表示要選取列表中的哪一個值。舉例來說, m[x] 表示列表 m 中的第 x 項,但請注意,項目從 0 開始編號。

此外,Python 也提供了一個很輕鬆快速的選取方法,也就是將 [x] 選取中的 x 改為一個負值。讓我們看看這個範例:

>>> a = [1, 2, 3, 4, 5]
>>> print(a[-2])
4

這是因為,Python 列表中的每一個項目,除了從零開始的正編號外,還有一個負數的編號!我們可以使用這張圖來瞭解列表的負數編號:

[x:y] 選取

有時候,我們選取列表並不只是想要選取列表中的單一項目,於是列表中的一個段落。舉例來說,在我們選取[1, 3, 5, 7, 9] 這個列表時,我們可以一次選取一個值,例如用 [2] 即會給我們 5 這個結果。

但是如果要選取段落呢?假設今天我們想要在剛剛的列表中選取 [5, 7, 9] 這段,那麼就不能使用 [x] 這種表示方法了。好在 Python 中,已經內建了這樣功能的選取工具。

讓我們來看看這個例子。有一個變數 a,其值是一個列表:

>>> a = [1, 3, 5, 7, 9]

如果現在我們想要選取的段落是列表 a 中的前 3 項,那麼我們可以用這樣的語法:

>>> print(a[0:3])
[1, 3, 5]

如果想要選取的段落是第 1、2、3 (由 0 開始編號),那麼我們會得到這樣的程式碼:

>>> print(a[1:4])
[3, 5, 7]

在此,我們可以得到兩個小小的結論。當我們使用 [x:y] 來選取列表時:

  1. 回傳一個新的列表
  2. 選取從 x 位置(含)開始
    到 y 位置(不含)結束的段落
  3. 選取列表長度共 (x-y) 項
    有時我們會看到別人在使用 [x:y] 選取時,使用了這樣的語法:
>>> a = [1, 2, 3, 4]
>>> print(a[:])
[1, 2, 3, 4]

這樣的語法代表著什麼呢?乍看之下,a[:] 感覺就很複雜不易懂。然而,這樣的語法其實使很簡單的,而且還為我們的程式帶來很大的便利性!讓我們試著看看以下的幾段程式:

>>> a = [1, 2, 3, 4, 5]
  

>>> print(a[0:5])
[1, 2, 3, 4, 5]
>>> print(a[:])
[1, 2, 3, 4, 5]
  

>>> print(a[0:3])
[1, 2, 3]
>>> print(a[:3])
[1, 2, 3]
  

>>> print(a[3:5])
[4, 5]
>>> print(a[3:])
[4, 5]

有沒有看出什麼相似性質呢?我們可以發現到,在上述這些狀況時,[x:y] 選取中的 x 和 y,其實是可以省略不寫的!Python 在解讀這樣的程式時,會依照這樣的規則來理解:

[x:y] 選取,若

  • x 空白(省略不寫)
    則補上 0,從列表首相開始選取

  • y 空白(省略不寫)
    則補上列表長度(選取至列表結束位置)

[x:y:d] 選取

除了上述的 [x:y] 選取外,還有一個相當有趣的選取方式,[x:y:d] 選取,其中,d 代表的是選取的公差。這樣講似乎有些複雜,讓我們馬上來看個範例:

>>> a = [1, 2, 3, 4, 5]
>>> print(a[0:5:1])
[1, 2, 3, 4, 5]
>>> print(a[0:5:2])
[1, 3, 5]
>>> print(a[0:5:3])
[1, 4]

看出什麼東西了嗎?讓我們再次回想剛剛說的,d 是選取時選取的公差,也就是每一次選取與上一次選取的間隔是多少。舉例來說,上面程式中,a[0:5:1] 就代表從在列表中的前 5 項裡,每間隔 1 就選取一次,因此我們會得到 [1, 2, 3, 4, 5] 的輸出結果。

a[0:5:2] 也是一樣的概念,它告訴電腦要在 a 列表的前 5 項中,每間格 2 就選取一次,因此我們得到 [1, 3, 5] 的輸出結果。這段過程,我們可以用下列這張圖來做個整理:

理解完了後,讓我們看看下一個例子:

>>> numbers = list(range(1, 11))
>>> odd = numbers[::2]
>>> even = numbers[1::2]
>>> print(odd)
[1, 3, 5, 7, 9]
>>> print(even)
[2, 4, 6, 8, 10]

在上述這個範例中,我們使用列表的選取製作出了兩個列表,一個帶有 1 至 10 中的奇數,另一個則是偶數。第一行中,我們使用了之前在討論 for迴圈 時學習過的 range() 函數來製作一個帶有數字 1 到 10 的列表。

如果你仔細看看第二與第三行,你會發現剛才所講過的 [x:y] 選取中,將 x 和 y 省略的技巧。這些小小的技巧有助於程式撰寫時的方便性以及日後修改程式時的易讀性。接下來,讓我們來介紹另一個寫程式時的小技巧:

我們可以偷偷地將程式修改,將 [x:y:d] 選取中的 d 改為一個負值,看看究竟會發生什麼事呢?讓我們來看看:

>>> a = [1, 2, 3, 4, 5]
>>> print(a[::-1])
[5, 4, 3, 2, 1]

神奇的事情發生了!原來,在 Python 中,若是想要將一個字串反轉,只需要將選取公差設為 -1 就好了。此外,你還可以將公差設為其它的負數,看看會發生什麼事吧!

 均一平台
 台達磨課師
 酷課雲
 可汗學院
無相關資源
 收起側邊目錄
 
前往目錄頁面