Re: [问题] sorting cmp_to_key

楼主: suhang (suhang)   2018-02-21 06:51:21
原题
http://www.lintcode.com/en/problem/word-sorting/
这题不知道该怎么用单纯的key去解,所以才想用comparator
不然就得手动写一个merge sort之类的
my solution in Python3
from functools import cmp_to_key
class Solution:
"""
@param alphabet: the new alphabet
@param words: the original string array
@return: the string array after sorting
"""
def wordSort(self, alphabet, words):
# Write your code here
myord = {}
rank = {}
for i, c in enumerate(alphabet):
myord[c] = i
def mycmp(a, b):
length = min(len(a), len(b))
for i in range(length):
if a[i] != b[i]:
return myord[a[i]] - myord[b[i]]
return len(a) - len(b)
words.sort(key = cmp_to_key(mycmp))
return words
※ 引述《uranusjr (←这人是超级笨蛋)》之铭言:
: ※ 引述《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 函式
作者: vfgce (小兵)   2018-02-21 07:50:00
你自己po的key=lambda word:[alphabet.index(c) for c...]这个就可以了.你的问题在那?化成list,list的比法就是依序比大小...前面几个都一样,就看长度,如[1,2]<[1,2,3]干嘛自己刻比较方法?
楼主: suhang (suhang)   2018-02-21 10:15:00
Thanks lambda我很少用,实在不熟 谢谢解释
作者: uranusjr (←這人是超級笨蛋)   2018-02-21 10:15:00
所以你已经解了, 那你到底想问什么问题?
作者: djshen (djshen)   2018-02-21 10:18:00
抄别人的好歹去了解一下为什么这样写吧问题不一样还照抄
作者: vfgce (小兵)   2018-02-21 12:21:00
你对python的资料结构及常用函式还不够熟,多了解一下list,tuple,set,dict,str有些什么东西,该怎么用..另外,别把其他程式语言的想法用在python,取较短序列比较的写法用for aa,bb in zip(a,b):来写即可,多了解一下内建函式,忘掉C及java...
作者: galeondx   2018-03-06 04:41:00

Links booklink

Contact Us: admin [ a t ] ucptt.com