使用比较功能对多个键进行排序 - 如何仅对一个键进行反转?

问题描述 投票:0回答:2

在 Python 3 中,

sort()
有参数
key
reverse
。如果您使用的是自定义比较功能,并且它对多个项目(每个对象)进行排序,您如何单独对每个项目进行升序或降序?在我的例子中,项目不是数字,所以否定一个值不是一个选项。

我没有看到任何语法方式来做我想做的事,所以我被困住了。在 Python 2 中,你可以很容易地做到这一点,因为比较函数返回

-1
0
+1
。 Python 3 似乎不够灵活。

python-3.x sorting key multiple-columns reverse
2个回答
0
投票

你会使用

functools.cmp_to_key()
功能:

将旧式比较函数转换为键函数。与接受键功能的工具一起使用(例如

sorted()
min()
max()
heapq.nlargest()
heapq.nsmallest()
itertools.groupby()
)。此函数主要用作从支持使用比较函数的 Python 2 转换的程序的转换工具。


0
投票

如果你正在做对象比较(好像你是),你可以定义dunder方法

__lt__
来规定如何在对象之间进行比较。由于您设置了比较规则,因此您可以根据需要进行排序,而不必为排序功能提供
key

例子


class Foo:
    def __init__(self, a, b):
        self.a = a
        self.b = b
    
    def __lt__(self, other):
        if self.a < other.a:
            return True
        if self.b > other.b:
            return True
    
    def __repr__(self):
        return f'({self.a}, {self.b})'


lst = [Foo(2, 'a'), Foo(2, 'b'), Foo(1, 'a'), Foo(1, 'c')]

print(sorted(lst))

# output:
# [(1, c), (1, a), (2, b), (2, a)]

说明

Foo
的实例首先在
a
上升序排序。如果
a
(整数)相同,则按
b
(字符串)降序排列。这个逻辑用
__lt__
方法表达。

© www.soinside.com 2019 - 2024. All rights reserved.