如何在数组中进行双重排序?

4 投票
4 回答
1485 浏览
提问于 2025-04-16 10:26

我不知道这种排序的确切术语是什么。这里是问题 - 我有一个类 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 个回答

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)
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)
7
bar.sort(key=lambda x: (x.attrb1, x.attrb2), reverse=True)

而且你不需要去定义 foo.sort

撰写回答