python中的排序函数
我正在尝试根据我的标准对对象列表进行排序 这是我的排序功能:python中的排序函数,python,sorting,Python,Sorting,我正在尝试根据我的标准对对象列表进行排序 这是我的排序功能: def sort_pots(self, pot1, pot2): coeff1 = ((pot1.movable + pot1.convertible) / pot1.total) coeff2 = ((pot2.movable + pot2.convertible) / pot2.total) if coeff1 > coeff2: return 1 elif coeff1 =
def sort_pots(self, pot1, pot2):
coeff1 = ((pot1.movable + pot1.convertible) / pot1.total)
coeff2 = ((pot2.movable + pot2.convertible) / pot2.total)
if coeff1 > coeff2:
return 1
elif coeff1 == coeff2:
return pot1.total - pot2.total
else:
return -1
我希望达到的目标是:
如果coeff1>coeff2,则pot1在pot2之前
如果coeff1==coeff2,则总数最高的一个在
否则(coeff2>coeff1),pot2在pot2之前
这个函数似乎没有相应地工作。我有一堆是按总数订购的,但系数不同。
我有(可兑换的,可移动的,总共):0,0,1和之后的0,3,4,然后是312281584,然后是1,0,1
以下是pot1和pot2类定义的开始:
class Potential:
def __init__(self,conf_opt):
self.conf_opt = conf_opt
self.total = 0
self.movable = 0
self.convertible = 0
谢谢。以下工作可以完成吗
def coef(pot):
return (pot.movable + pot.convertible) / float(pot.total)
l.sort(key=lambda x: (coef(x), x.total), reverse=True)
它甚至应该更快(键比cmp好)。下面的方法行吗
def coef(pot):
return (pot.movable + pot.convertible) / float(pot.total)
l.sort(key=lambda x: (coef(x), x.total), reverse=True)
它甚至应该更快(key比cmp好)。我认为tonfa的答案是最可读的,但是如果你想用你的代码来做,你应该试试:
def sort_pots(self, pot1, pot2):
coeff1 = ((pot1.movable + pot1.convertible) / pot1.total)
coeff2 = ((pot2.movable + pot2.convertible) / pot2.total)
if coeff1 > coeff2:
return 1
elif coeff1 == coeff2:
return cmp(pot1.total,pot2.total)
else:
return -1
编辑:使用方法而不是长格式if/else我认为tonfa的答案最具可读性,但如果您想使用现有代码进行编辑,您应该尝试:
def sort_pots(self, pot1, pot2):
coeff1 = ((pot1.movable + pot1.convertible) / pot1.total)
coeff2 = ((pot2.movable + pot2.convertible) / pot2.total)
if coeff1 > coeff2:
return 1
elif coeff1 == coeff2:
return cmp(pot1.total,pot2.total)
else:
return -1
编辑:使用方法而不是长格式if/else作为最后一个注释,您可以覆盖
\uuuu cmp\uuu
方法,如下所示:
class Potential(object): # new style classes FTW!
...
def __cmp__(self, other):
coeff1 = (self.movable + self.convertible) / self.total
coeff2 = (other.movable + other.convertible) / other.total
return cmp((coeff1, self.total), (coeff2, other.total))
这样,只需调用不带参数的sort()
即可实现正常的排序顺序。您甚至可以将建议的coeff
函数作为类的一部分:
class Potential(object):
...
def coeff(self):
return (self.movable + self.convertible) / self.total
def __cmp__(self, other):
return cmp((self.coeff(), self.total), (other.coeff(), other.total))
作为最后一点,您可以按如下方式覆盖
\uu\cmp\uu
方法:
class Potential(object): # new style classes FTW!
...
def __cmp__(self, other):
coeff1 = (self.movable + self.convertible) / self.total
coeff2 = (other.movable + other.convertible) / other.total
return cmp((coeff1, self.total), (coeff2, other.total))
这样,只需调用不带参数的sort()
即可实现正常的排序顺序。您甚至可以将建议的coeff
函数作为类的一部分:
class Potential(object):
...
def coeff(self):
return (self.movable + self.convertible) / self.total
def __cmp__(self, other):
return cmp((self.coeff(), self.total), (other.coeff(), other.total))
他想按降序排序,所以
reverse=True
。他想按降序排序,所以reverse=True
。我猜return pot1.total-pot2.total
是一个错误,因为您的函数应该只返回1,0或-1。我猜return pot1.total-pot2.total
是一个错误,因为您的函数应该只返回1,0或-1。如果您想这样做,只需调用-cmp(pot1.total,pot2.total)
。只返回1或-1会有区别吗?如果您想这样做,只需调用-cmp(pot1.total,pot2.total)
。只返回1或-1会有区别吗?