Python初學第六講

排序、反轉和查找櫃子內的東西

在 上一講 中我們介紹了可以有效紀錄連續性資料的一種資料型態 — list 。現在,我們可以將一連串相關、有順序性的資料記錄起來了。

當在處理一連串有順序性的資料的時候,如果能夠將其整理一下,依照大小、或是依照特性重新排列,在處理上會更加方便。在這一講中,將會介紹如何排序 list ,以及如何找到一個 list 中的一些特定的值,使資料更能夠掌握。

另外,也會介紹 list 跟 for 迴圈 for-loop 搭配的使用方法,使我們能夠針對每一筆資料去做處理。

串列的排序

1. 排序 list

若想要排序 list 的話,我們會使用 sort method。

list_name.sort()

Note: sort 括號中可以設定排序的條件。

(1) 初始設定
若括號中什麼都不加的話,字串會照字母順序排列、數字則會是遞增排列。

以 bad 這個 list 為例,執行 sort method 後,所有元素會依字母順序排列。

bad = ['Bad','Smooth Criminal','Speed Demon','Man in the Mirror','Dirty Diana']
bad.sort()
print(bad)

排序後的結果如下,我們可以看到 bad 這個 list 內的東西已經被我們排序過了,排序的方式是依照字母順序排列。

若 list 的清單中元素的資料型態為整數或浮點數,則會遞增排列。

num = [23, 4, 53, 5 ,35, 6]
num.sort()
print(num)

結果如下:

(2) 倒轉排序

如果想要數字遞減排列、或是依照字母順序的反向排列呢 ?

list_name.sort(reverse=True)

在括號中加上 reverse=True 的條件設定就能達到 !
可以自己在 Jupyter Notebook 上試試看。

2. 在不更動原 list 的情況下產生一個排序過的 list

在上面使用 sort method 時,你可能已經發現,原本的整個 list 會被更動排序。很多時候我們會想要保存完整的資料、不想輕易更改,但同時又需要有被整理過的資料。此時便可以使用 sorted 這個函數。

sorted_list = sorted(list_name)

我們使用 sorted() 來取得排序過的資料
然後另外產生一個變數 sorted_list 來儲存這個資料,這樣原本的 list 就不會被更動到啦~

3. 反轉 list

如果想要把 list 內東西的順序反轉的話,可以使用 reverse method。

list_name.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 後結果如下:

串列的極值與查找

1. list 的極大、極小值與總和

想要直接取得 list 中的極值, 可以用 max()min() 這兩個函數。

#極大值
max(list_name)
#極小值
min(list_name)

若想知道 list 中各元素的總和,則有 sum() 這個函數。

sum(list_name)

例子如下 :

num = [23, 4, 53, 5 ,35, 6]
print(max(num))
print(min(num))
print(sum(num))

程式便會很有效率地印出極大、極小值、以及這個 list 所有數字的總和了。

2. list 的查找

(1) index method

要查找某一個元素在一個 list 裡面的索引值,可以使用 index method。

list_name.index(element)

使用的方法是,在 index 後的括號中輸入想要找的東西,這個 method 會將索引值回傳。

以 bad 這個 list 為例,如果想要知道 Dirty Diana 這首歌的索引值,可以輸入 bad.index("Dirty Diana"),可以看到 method 回傳了 4,也就是 Dirty Diana在這個 list 的 index。

bad = ['Bad','Smooth Criminal','Speed Demon','Man in the Mirror','Dirty Diana']
print(bad.index("Dirty Diana"))

值得注意的是,如果輸入的元素並不包含在 list 裡面的話,會出現 value error。例如把上面例子中的 Dirty Diana 改成 Heal the WorldHeal the World 並不在 list 中,就會發生錯誤。

那麼可以如何確認一個元素是否存在於 list 中呢?
可以使用in 運算元 (operator)。

(2) in operator

in 是一個 Python 中的運算元,會回傳 TrueFalse
使用 in 的方法如下:

element in list_name

以剛剛要查詢的 Heal the World 為例,印出 "Heal the World" in bad ,如果元素存在於清單中的話,會回傳 True ;相反的,如果不存在清單中,就會回傳 False

bad = ['Bad','Smooth Criminal','Speed Demon','Man in the Mirror','Dirty Diana']
print("Heal the World" in bad)
print("Smooth Criminal" in bad)

由上面的例子可以看到,如果印出 "Heal the World" in bad 的話,會印出 False ,若是"Smooth Criminal" in bad 則會印出 True

list 與 for-loop

剛剛介紹了如何判定某個元素在不在 list 當中,現在我們可以使用這個 operator 搭配 for loop,來印出一個 list 裡面的每一個元素。

for item in list_name:
print(item)

使用 for loop 的時候記得要縮排 ! 迴圈每跑一次,item 就會等於 list 裡面的其中一個元素。

現在來建立一個新的清單 dangerous

dangerous = ['Jam', 'In the Closet', 'Remember the Time',"Heal the World","Black or White","Who Is It","Give In to Me", "Dangerous"]
for item in dangerous:
print(item)

可以看到清單裡面的 item 就被一個一個印出來啦。
至於為什麼他是一行一行的印出,是因為 print() 本身的設定就是會在末端換行,如果想要改成每個元素以空格為間格印出的話,可以把 print(item) 改為 print(item, end=" ")

item 所代表的只是一個變數,可以自己任意設定名稱 (例如改成 i , j , k 等等都沒問題) ,如果把例子中的 item 改成 song 也會得到一樣的結果,可以自己試試看。

dangerous = ['Jam', 'In the Closet', 'Remember the Time',"Heal the World","Black or White","Who Is It","Give In to Me", "Dangerous"]
for song in dangerous:
print(song)

enumerate function

我們也可以使用 Python 中的一個函數來同時取得一個元素在一個 list 中的 index 與他的值。使用的方法如下 :

for index, item in enumerate(list_name):
print(index, item)

dangerous 為例 :

dangerous = ['Jam', 'In the Closet', 'Remember the Time',"Heal the World","Black or White","Who Is It","Give In to Me", "Dangerous"]
for index, song in enumerate(dangerous):
print(index, song)

就會同時得到 index 和 value 了,非常方便。

如果不想另外用一個變數去接 index 也可以,結果如下:

dangerous = ['Jam', 'In the Closet', 'Remember the Time',"Heal the World","Black or White","Who Is It","Give In to Me", "Dangerous"]
for song in enumerate(dangerous):
print(song)

也可以自己更改 index 的起始值,在 enumerate function 後面加上 start 的定即可。方法如下:

enumerate(list_name, start = 1)

start 後面接上想設定為起始值的數字即可。

dangerous = ['Jam', 'In the Closet', 'Remember the Time',"Heal the World","Black or White","Who Is It","Give In to Me", "Dangerous"]
for index, song in enumerate(dangerous, start = 1):
print(index, song)

可以看到,元素前面的標號就變成從 1 開始了。

把 list 轉換為字串

在處理 list 的時候,我們常常會想把一個 list 傳換成一個由一些特定的值所分開的字串 (string)。要做到這件事,會常使用到一個 string 的 method — str.join()

join method 的用法如下:

list_str = 'seperateStr(要用來隔開的符號)'.join(list_name)

舉例來說,如果我們想要把 Dangerous 這張專輯輸出成一個用逗號所隔開的字串,可以另外產生一個變數 dangerous_str ,並且令他的值為 ','.join(dangerous) ,把 list 的值用逗號串在一起。

程式碼如下 :

dangerous = ['Jam', 'In the Closet', 'Remember the Time',"Heal the World","Black or White","Who Is It","Give In to Me", "Dangerous"]
dangerous_str = ', '.join(dangerous)
print(dangerous_str)

執行的結果如下 :

可以看到,list 裡面的內容就被用逗號給隔開了~

引號裡面的值是可以視你的需求隨意更換的,例如如果我們想要把專輯內容用斜線給隔開,把程式碼改為 dangerous_str = '/'.join(dangerous) 即可。

更改引號中的符號,串列中的內容就會被你所指定的符號所隔開。

把字串切成 list

上面我們把 list 切成了一個字串,那我們可不可以反過來,將字串切成 list 呢? 答案當然是可以的(而且很常使用到)。我們使用 str.split() 就可以做到這件事了。

new_list = str.split() #如果括號中不放東西,就是以空白做切割
new_list = str.split(',') #如果放逗號,就會把用逗號隔開的值所切割開

拿上面 dangerous 的例子來說明,如果想要把產生的字串做切割變回原本的 list, 程式碼如下:

dangerous = ['Jam', 'In the Closet', 'Remember the Time',"Heal the World","Black or White","Who Is It","Give In to Me", "Dangerous"]
dangerous_str = '/ '.join(dangerous)
new_dangerous_list = dangerous_str.split("/ ")
print(new_dangerous_list)

裡面的 new_dangerous_list 就是 dangerous_str"/ " 做分隔,切割出來的結果,可以看到 new_dangerous_list 又變回原本 list 的資料型態了。

有時在寫題目的時候,要處理一連串的數字資料,這個用法就很好用。

題目常給定一連串用空白的數字,例如 2 3 5 6 3 2 ,這個時候如果把這些數字都存進一個 list 中,處理上就會方便許多。

要分割 input()所輸入的值,程式碼如下:

lst = input().split()

可以把 input() 的這個東西想成一個字串,對這個字串使用 split() ,程式便會幫你把你 input 的東西以空白作為分隔,切割成一個個字串,再裝進 list中。執行的結果如下:

可以看到, 在 list 中的數字都有用雙引號刮起來,代表他們的型態都還是字串。

那如果想要把 list 中的數字都存成整數的形態要怎麼辦呢 ? 當
然你可以在切割完後再跑一個迴圈,將 list 中的數字一個個轉換成數字。
但是有一個更快速的用法,你可以在切割的時候就直接把切出來的東西做型別轉換,這樣程式就只需要寫一行就可以了,簡潔明瞭許多。

程式碼如下:

lst = [int(num) for num in input().split()]
print(lst)

Note: 這個方式在 Python 中叫做 List Comprehension

可以看到,程式在切割完就直接做型別轉換,然後指定給我們新要產生的 list 了,印出來的 list 裡面所裝的就是一個個的整數。 這個用法在寫題目的時候很方便,可以多加應用。

現在我們已經對 list 用法有更深的了解,可以更好的掌握一連串的資料了~接下來會介紹另外兩種跟 list 很像、但使用方式有些不同的資料型態。

我們是 ccClub 團隊,致力於讓 Python 成為大家的第二外語,希望能用淺顯易懂、循序漸進的方式,帶領新手一步步跨入程式設計的世界。如果你喜歡這篇文章,請給我們 1~10 個掌聲。
如果你喜歡「Python初學」的教學系列文,請給我們 11 個以上的掌聲。

Facebook: ccClub Python讀書會