iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 17
0
Software Development

從0開始學習程式-Python系列 第 18

[Day21]排序?index sort? lambda又有你的事了?


終於停雨啦~都快發霉了~
Sunday funday XD
我們快點學一學出門玩囉!

你還記得sort嗎?

我們先來複習一下之前講的sorting:

  1. .sort()是直接在原本的list排序,然而sorted(list)是將list整個拿出來並排序後,需要有變數去接排序結果,但不會影響原本的list
  2. reverse=False是指排序由小到大,而reverse=True是指排序由大到小。在sorting時,若沒有指定reverse,將是默認為False
  3. 若是排序字串,則會利用ASCII進行比較,且字串和數字不能在同一個list比較,兩種變數型態不相同
L=[4,3,5,90,23]
print(sorted(L)) #output:[3, 4, 5, 23, 90]
print(L) #output:[4, 3, 5, 90, 23]
L.sort(reverse=True)
print(L) #output:[90, 23, 5, 4, 3]

是不是覺得上面太簡單?

然而,有時候我們要排序的內容並非只有一個資料,而是一組資料,有點類似再使用Excel排序時,以某一個指定column的值進行比較,排序時會移動整個row。

在python也是要來處理相似的觀念,以下舉一個最常見學生成績排名為例子:
這裡有四位學生Joey, Monica, Ross, Rachel,成績及等地如下,請依照成績進行排名。
['Joey', 'A', 15],['Monica', 'B', 12],['Ross', 'C', 8],['Rachel', 'B', 10]

students = [
['Joey', 'A', 15],
['Monica', 'B', 10],
['Ross', 'C', 8],
['Rachel', 'B', 12]
]
student_sort_1 = sorted(students)
student_sort = sorted(students, key = lambda student : student[2])

print(student_sort_1)
#output:[[['Joey', 'A', 15], ['Monica', 'B', 10], ['Rachel', 'B', 12], ['Ross', 'C', 8]]
print(student_sort)
#output:[['Ross', 'C', 8], ['Monica', 'B', 10], ['Rachel', 'B', 12], ['Joey', 'A', 15]]

一起來觀察student_sort_1結果,可看到排列的順序是依照column 0的ASCII的大小進行排列(即以人名進行排列),然而如果希望依照成績來排列,就是利用column 2進行排列的話,則需要利用key來幫忙,key後方要接一個函數,因此lambda就成為它最重的利器。

  • key = lambda student : student[2]
    意義:令students這個list中,最外層的每個元素叫做student,然後將每個student指定一個比較值,這個值來自於自己那個student裡面index=2的這一項作為比較標準。例如:['Monica', 'B', 10]的key就是被指定為10,['Joey', 'A', 15]的key就是被指定為15。

那如果我想要sorting index?

有時排序不用直接告訴使用者由小到大的正確排序,反而他們需要是index,簡言之,他們需要知道當他們要取這個value時,應該要用哪個index去抓。同樣舉個例子:

s = [2, 3, 1, 4, 9]
sorted_s = sorted(range(len(s)), key = lambda k : s[k]) 
print(sorted_s) #output:[2, 0, 1, 3, 4]

這裡透過range(len(s)來建立s list的index,及依序為0,1,2,3,4。因此,真正被操作sorting的是index,而非s list,但同理我們利用利用key來幫忙,利用lambda指定每個index的value。

  • key = lambda k : s[k]
    意義:將s = [2, 3, 1, 4, 9]依序指定給0, 1, 2, 3, 4,即s[k],而在sorting時就是利用s[k]的數值大小進行排列。例如,index=0是被指定數值為2,index=3是被指定數值為4,排序時就是看數值2,4...進行index的排序,或者可以想成index就是上面的學生,而數值為成績,用成績排進行排名得斯~

好了!我想今天難度已經達到大家可理解極限囉!
我們今天就到這吧~
在兩週我們就結束囉XD


上一篇
[Day20]lambda的三角督...filter(),map(),reduce()
下一篇
[Day22] I want it that way! global variable就是要這樣用!
系列文
從0開始學習程式-Python32

尚未有邦友留言

立即登入留言