python中的排序函数

时间:2009-11-16 14:54:46

标签: 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 == 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

感谢。

3 个答案:

答案 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