日常用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