作者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 函式
--
1F:→ GNUGCC:void main(void) 的写法是可行的唷^^08/10 00:59
2F:→ GNUGCC:虽然这个写法较传统,但是语法与文法都正确哦^^08/10 02:16
3F:→ GNUGCC:目前我使用的 Visual C++ 都接受 void main(void) 与 08/10 20:18
4F:→ GNUGCC:int main(void),各位可以把 C++ 专案改成原生 C++ 类型来 08/10 20:19
5F:→ GNUGCC:用 void main(void) 来写发现也可通过编译. 08/10 20:21
6F:→ GNUGCC:这个就是 Visual C++ 的弹性.08/11 20:23
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.161.94.175
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1519118968.A.29D.html
7F:推 s860134: 2.7 记得就有 02/21 20:40