如何在数组内执行双重排序?

时间:2011-01-22 13:43:08

标签: python sorting

我不知道这种排序的确切术语。这是问题 - 我有一个班级foo

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

    def sort(self):
        return self.attrb1 

数组“bar”包含foo类型的对象。我想根据这两个属性按降序对数组进行排序。首先是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

我该怎么做?

4 个答案:

答案 0 :(得分:7)

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

您无需定义foo.sort

答案 1 :(得分: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)

答案 2 :(得分:1)

如果您有值元组,则已经执行此操作。 如果更改方法排序以返回元组:

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

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

然后解决方案非常简单:

  

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

答案 3 :(得分:1)

你也可以不用lambda(我个人不喜欢)这样做:

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)