2009-11-16 133 views
1

我想根據我的標準對對象列表進行排序。python排序功能

這裏是我的排序功能:

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中,具有最高總爲前 else(coeff2> coeff1),pot2在pot2之前

並且該功能似乎不起作用。我有一堆根據總數排序,但沒有相同的coeff。 I've(convertible,movable,total):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

我猜return pot1.total - pot2.total是一個錯誤,因爲你的函數應該只返回1,0或-1。 – 2009-11-16 15:05:05

回答

9

以下是否有效?

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

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

它應該更快(鍵比cmp好)。

+2

他想降序排序,所以'reverse = True'。 – Stephan202 2009-11-16 15:02:57

+0

對,謝謝。 – tonfa 2009-11-16 15:10:31

1

我想拐的答案是最可讀的,但如果你想用代碼來做到這一點,你有你應該嘗試:

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

+1

如果你想這樣做,只需調用'-cmp(pot1.total,pot2.total)'。 – tonfa 2009-11-16 15:12:04

+0

剛剛返回1或-1會產生差異嗎? – LB40 2009-11-16 15:12:21

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)) 

這樣,正常的排序順序是由CA剛剛實現沒有參數的lling 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))