关于python排序sort中的比较方法

日常用python刷题中,我比较少遇到要比较很多个参数的情况,往往在list中用sort排序一下也就解决问题了

nums.sort())

实在不行用key指定lambda函数来确定比较是表中第几项也就够用了.

nums.sort(key=lambda x:x[1]) #指定以第二项作为比较项

但是今天遇到需要同时比较多项内容的时候我就抓瞎了,其实是很常规的内容,大概实现的功能要如下:

比较每一个元素的首项,如若相等,则比较第二项

很简单有没有!
但是我就是不会写,如若放在c++中运算符重载以下也就搞定了,可是python中好像没这玩意,还能咋办,那就找吧
其他语言给出的方法是指定cmp函数(),可在python中,此方法仅适用于python2.X,但是大家都知道python2.X即将淘汰了,所以我们跳过不看,来看看在python3中的实现方法吧.
就是用参数key指定函数,cmp还是能用,但是我们需要一点转化的手段

将老式的比较函数(comparison function)转化为关键字函数(key function)

比较函数是可调用的,接受两个参数,比较这两个参数并根据他们的大小关系返回负值、零或正值中的某一个。关键字函数也是可调用的,接受一个参数,同时返回一个可以用作排序关键字的值。
大概使用方式如下:

  #当首元素相等时,比较下一个元素
    from functools import cmp_to_key
            def cmp(a,b):
                if a[0]-b[0]!=0:
                    return a[0]-b[0]
                else:
                    return a[1]-b[1]
            people.sort(key=cmp_to_key(cmp),reverse=True)

我们再来看看cmp_to_key这个函数的源码吧

def cmp_to_key(mycmp):
    'Convert a cmp= function into a key= function'
    class K(object):
        def __init__(self, obj, *args):
            self.obj = obj
        def __lt__(self, other):
            return mycmp(self.obj, other.obj) < 0
        def __gt__(self, other):
            return mycmp(self.obj, other.obj) > 0
        def __eq__(self, other):
            return mycmp(self.obj, other.obj) == 0
        def __le__(self, other):
            return mycmp(self.obj, other.obj) <= 0
        def __ge__(self, other):
            return mycmp(self.obj, other.obj) >= 0
        def __ne__(self, other):
            return mycmp(self.obj, other.obj) != 0
    return K

最后附上用来练手的力扣题.

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。
编写一个算法来重建这个队列。

注意: 总人数少于1100人。

示例

输入: [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

输出: [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height

    #这是我的代码
    class Solution:
        def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
            from functools import cmp_to_key
            def cmp(a,b):
                if a[0]-b[0]!=0:
                    return a[0]-b[0]
                else:
                    return b[1]-a[1]
            people.sort(key=cmp_to_key(cmp),reverse=True)
            ans=[]
            for i in people:
                ans.insert(i[1],i)
            return ans
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值