我正在尝试根据我的标准对对象列表进行排序。
这是我的排序功能:
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然后31,228,1584然后是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
感谢。
答案 0 :(得分:9)
以下是否有效?
def coef(pot):
return (pot.movable + pot.convertible) / float(pot.total)
l.sort(key=lambda x: (coef(x), x.total), reverse=True)
它甚至应该更快(密钥优于cmp)。
答案 1 :(得分:2)
正如最后一点,您可以覆盖__cmp__
方法,如下所示:
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))
答案 2 :(得分:1)
我认为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
编辑:使用cmp方法而不是长格式if / else