作者uranusjr (←這人是超級笨蛋)
看板Python
標題Re: [問題] sorting cmp_to_key
時間Tue Feb 20 17:29:26 2018
※ 引述《suhang (suhang)》之銘言:
: https://stackoverflow.com/questions/10645986/custom-sort-python
: 我想將
: key = lambda word: [alphabet.index(c) for c in word[0]]
: 這行轉換成老式cmp function
: def mycmp(a, b):
: return a - b
: sorted(words, key = cmp_to_key(mycmp))
: 但是不太會寫
: 請大家提示一下 a, b分別該是什麼? 謝謝
cmp 與 key 的寫法邏輯完全不一樣
直接轉換基本上是行不通的, 重寫比較快
你必須要仔細想一下你的比對邏輯到底是什麼, 才能寫出正確的比較函式
key 函式是把本來不能比較(或比較法和你想的不同)的東西轉換成可比較的東西
接著再用轉換過的東西排序
例如你想把 ['apple', 'orange', 'pear'] 用字串長度排列
就會把它們轉成字串長度 [5, 6, 4], 排序成 [4, 5, 6] 再轉回來
那個轉換函式就是 key 函式, 在這個例子就是取字串長度的 len()
cmp 函式則是會一次給你兩個輸入 a, b 讓你比大小
如果 a < b 回傳負數, a > b 正數, 相等回 0
同樣用上面的例子, 如果 a = 'apple', b = 'orange' 就要回負數
因為 len('apple') < len('orange)
在這個狀況中, 有個簡單的通解可以達成目的
def cmp_strs(a, b):
return len(a) - len(b)
你把可能的三個輸入代進去, 應該就能知道為什麼
如同推文提到, cmp 函式並不是特別優秀的功能
從上面的例子也可以看出來, cmp 函式的實作方法相對不直覺
根據你想要實作的比較, 甚至可能需要很精明的程式碼, 需要另外註解來解釋
除非你需要支援非常舊(不支援 key)的 Python 版本
否則幾乎永遠不應該寫 cmp 函式, 而應該使用更簡潔易懂的 key 函式
--
→ GNUGCC:void main(void) 的寫法是可行的唷^^08/10 00:59
→ GNUGCC:雖然這個寫法較傳統,但是語法與文法都正確哦^^08/10 02:16
→ GNUGCC:目前我使用的 Visual C++ 都接受 void main(void) 與 08/10 20:18
→ GNUGCC:int main(void),各位可以把 C++ 專案改成原生 C++ 類型來 08/10 20:19
→ GNUGCC:用 void main(void) 來寫發現也可通過編譯. 08/10 20:21
→ GNUGCC:這個就是 Visual C++ 的彈性.08/11 20:23
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.94.175
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1519118968.A.29D.html
推 s860134: 2.7 記得就有 02/21 20:40