2012-07-28 18 views
10

您可以通過使用key參數的sorted功能排序的myclass數組:Python:排序自定義類而不使用`key`參數?

sortedlist = sorted(myclasses, key=lambda obj: obj.myproperty) 

有沒有辦法來定義我們班一個自然排序?也許有一些神奇的方法,以便我們不必每次都要傳遞一個密鑰?

例如,

class myclass: 
    def __init__(self,a,b): 
     self.key1 = a 
     self.key2 = b 

    def __sortkey__(self): 
     return self.key2 

或者,如果我們定義__le__也許它會自然地工作?

回答

3

我想通過覆蓋__cmp__

class myclass: 
    def __init__(self,a,b): 
     self.key1 = a 
     self.key2 = b 

    def __cmp__(self, other): 
     return cmp(self.key2, other.key2) 
+0

啊。太好了!找不到http://docs.python.org/library/functions.html#sorted – mpen 2012-07-28 23:11:45

+8

請注意'__cmp__'在Python 3中不起作用 – samfrances 2012-07-28 23:20:03

13

除了__cmp__做到這一點,你也可以用所謂的 「富比較運算符」 __eq____le____lt____gt____ge__做到這一點。而不是定義所有這些,你可以在2.7 +/3.1 +中使用functools.total_ordering類裝飾器。 __cmp__在3.x中消失了。

+1

甚至更​​好。 '__le__'更容易實現,因爲我只需要返回一個布爾值。 – mpen 2012-07-28 23:17:54