функция сортировки в питоне - PullRequest
1 голос
/ 16 ноября 2009

Я пытаюсь отсортировать список объектов по моим критериям.

Вот моя функция сортировки:

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 ]

9 голосов
/ 16 ноября 2009

Работает ли следующее?

def coef(pot):
    return (pot.movable + pot.convertible) / float(pot.total)

l.sort(key=lambda x: (coef(x), x.total), reverse=True)

Это должно быть даже быстрее (ключ лучше, чем cmp).

2 голосов
/ 16 ноября 2009

Так же, как последнее замечание, вы можете переопределить метод __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))
1 голос
/ 16 ноября 2009

Я думаю, что ответ 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 , а не длинная форма, если / иначе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...