Python 板


LINE

※ 引述《KSJ (阿真)》之銘言: : 也參考過回文的文章 跟參考文章 : 對於以下的解釋還是不解(雖然會使用了) : 想請板友們幫個忙: : : " : key 的使用方式比前面 cmp 的方式來的直覺,而且速度較快, : 因為排序的時候,只要需要比較的動作就會呼叫 cmp, : 而 key 只會被呼叫 n 次,n 是序列的長度,所以 key 的速度較快。 : " : : 我的想法是 : 比方有三個數 [小 ,大 ,中] : cmp感覺是 先抓 小 大 二個比 把小放在第一位 : 再抓 大 中 二個比 : 再抓 小 中 二個比 把中放在第二位 : 把大放在第三位 : 二個疑問: : 1. 對於key的比法(還是說 應該稱作 "準則") 是類似cmp這樣嗎?怎麼比的呢? 直接拿 key 與 cmp 參數來比較是不太適當的,因為兩者負責的工作(任務)不同, 且二者不是互斥的。 cmp 參數的責任是指出任兩個 element(a, b) 的大小: -1 for a < b 0 for a == b 1 for a > b 如果 list element 本身就是 comparable(有 natural order),而你想要 list 排序的順序就是依照 natural order,你可以不需要提供 cmp 參數。 如果你想要依照 natural order 以外的規則來排序,或者是 list element 本身 不是 comparable(比如 element 是一種複合的結構),那麼就需要提供 cmp 參數。 以 element 為複合的結構為例,自行提供的 cmp function 依照某種邏輯來決定 大小關係。比如說 list element 為 tuple,這些 tuple 皆是升冪排列的整數 數列,我希望將這些 tuple 依照其 maximum 來升冪排序。 A=[(2, 4, 6, 8), (1, 3, 5), (1, 2, 4)] A.sort(cmp=lambda a, b: cmp(a[-1], b[-1])) print A # [(1, 2, 4), (1, 3, 5), (2, 4, 6, 8)] 在不搭配 key 參數的情況下,cmp 參數帶進來的 function 在面對複合型態的 物件時,通常要做兩件事: 1.從兩個 object 中擷取主導排序的數據 2.決定擷取出來的數據的大小 在 list.sort 執行過程中(不論 list.sort 實際上是使用哪一種排序演算法),當 有需要比較某兩個 element 時,cmp 參數帶進來的 function 都會被執行一次。 key 參數負責的任務是從 element 擷取出主導 element 順序的關鍵數據,取出來的 關鍵數據必須是 comparable。 延續前面的例子: A=[(2, 4, 6, 8), (1, 3, 5), (1, 2, 4)] A.sort(key=lambda s: s[-1]) print A # [(1, 2, 4), (1, 3, 5), (2, 4, 6, 8)] 這種作法是先把一個 object sequence 經過一個 mapping 變成另一個 object sequence(兩個 object sequence 對應的 element 有關連),然後以後者來做 sorting。 [2 4 6 8] [1 3 5] [1 2 4] <=== A | | | | | | <== map(lambda s:s[-1], A) | | | 8 5 4 <=== B ↓ sort B 4 5 8 <=== sorted B | | | [1 2 4] [1 3 5] [2 4 6 8] <=== sorted A 所以在這種排序複合元素的情況下,通常指定 key 參數會比較有效率,因為 cmp 參數指定的 function 每次在決定元素大小前都要做一次擷取關鍵數據的 動作,而 key 參數指定的 function 是一開始拿來將每個元素的關鍵數據取出, 之後進行排序時就不再使用到。 如果 key 參數(function)擷取的數據的 natural order 不同你想要的順序, 可再搭配 cmp 參數。 : 2. 又對於最原本的sort()方法 是用最佳化的比法 還是最簡單的比法呢?? 有沒有客製 cmp or key function,list.sort 使用的排序演算法都是一樣的。 我猜 list.sort 應該是使用 quicksort 變化而來的演算法,可能在 list size 夠小時是使用其他的排序演算法,size 大時使用 quicksort。 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.137.110 ※ 編輯: sbrhsieh 來自: 218.173.137.110 (11/20 15:05)
1F:→ sbrhsieh:簡單地說,cmp 決定任二 key 的產物的大小 11/20 15:16
2F:→ sbrhsieh:沒有指定key,key預設是identity function:lambda x: x. 11/20 15:17
3F:推 KSJ:感動…我竟然看懂了q_q 感謝S大<(_ _)> 推一個 11/21 16:33
4F:推 timerover:推一個 11/21 20:53







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP