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会有区别吗?