在 Python 3 中,
sort()
有参数 key
和 reverse
。如果您使用的是自定义比较功能,并且它对多个项目(每个对象)进行排序,您如何单独对每个项目进行升序或降序?在我的例子中,项目不是数字,所以否定一个值不是一个选项。
我没有看到任何语法方式来做我想做的事,所以我被困住了。在 Python 2 中,你可以很容易地做到这一点,因为比较函数返回
-1
、0
、+1
。 Python 3 似乎不够灵活。
functools.cmp_to_key()
功能:
将旧式比较函数转换为键函数。与接受键功能的工具一起使用(例如
、sorted()
、min()
、max()
、heapq.nlargest()
、heapq.nsmallest()
)。此函数主要用作从支持使用比较函数的 Python 2 转换的程序的转换工具。itertools.groupby()
如果你正在做对象比较(好像你是),你可以定义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__
方法表达。