※ 引述《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 函式