2011-01-22 37 views
4

我不知道這種類型的分類確切的術語。這是問題所在 - 我有一個類類型的foo foo如何在數組內執行雙重排序?

class foo: 
    def __init__(self,a1,a2): 
     self.attrb1 = a1 
     self.attrb2 = a2 

    def sort(self): 
     return self.attrb1 

陣列「欄中的」包含對象。我想按照這兩個屬性降序排列數組。首先由attrb1

bar.sort(key=foo.sort,reverse=True) 

然後我想根據attrb2內自行排序元素進行排序。因此,對於陣列中的兩個元素foo1和foo2,我們有 -

foo1 > foo2 
if foo1.attrb1 > foo2.attrb1 
elif foo1.attrb1 == foo2.attrb1 
foo1.attrb2 > foo2.attrb2 

我該怎麼做?

回答

7
bar.sort(key=lambda x: (x.attrb1, x.attrb2), reverse=True) 

而且你不需要foo.sort

+1

你好,不好意思回來到這個話題,但如果我們需要使用反向特性做第一個排序,但我們並不需要反向爲第二類,怎麼可能我們這樣做。 例如,我們希望第一個屬性按遞減整數值排序,但我們希望按照字母順序排列具有相同值的項目。 在提議的解決方案中,反向屬性應用於在列表上執行的所有排序。 – 2011-11-25 21:37:25

2

您使用類已經所以才實現__lt__定義:

class foo: 
    def __init__(self,a1,a2): 
     self.attrb1 = a1 
     self.attrb2 = a2 

    # just for convenience in `__lt__` 
    def defaultorder(self): 
     return self.attrb1, self.attrb2 

    # answers `self < other`, used by the sorting algorithm 
    def __lt__(self, other): 
     return self.defaultorder() < other.defaultorder() 

bar.sort(reverse=True) 
1

排序已經做到這一點,如果你有值的元組。 如果更改排序方法返回一個元組:

class foo: 
    def __init__(self,a1,a2): 
     self.attrb1 = a1 
     self.attrb2 = a2 

    def sort(self): 
     return self.attrb1, self.attrb2 

然後將溶液是非常簡單的:

bar.sort(鍵= foo.sort,反向= TRUE)

1

你也可以不用拉姆達(我個人不喜歡):

import operator 
bar.sort(key=operator.attrgetter("attrb1","attrb2")) 

operator.attrgetter是這樣的:

a = foo(3,4) 
b = operator.attrgetter("attrb1","attrb2")(a) 
print(b) # You get (3,4)