TL;DR:您可以对需要的位置添加
reversed=True
参数进行两次排序。先按次要排序,这样做的原因是 Python 的排序是稳定的。
如果
attribute2
是一个数字,那么在元组中使用
- attribute2
代替
attribute2
是最简单的方法。
如果
attribute2
是一个字符串或其他不能以有意义的方式乘以
-1
的东西,则此技巧无法使用。
然而,请注意,Python 中保证
lst.sort
和
sorted
是
稳定排序算法。特别地,这意味着以下两个代码片段是等价的:
l.sort(key=lambda x: (x[0], x[1]))
l.sort(key=lambda x: x[1])
l.sort(key=lambda x: x[0])
请注意第二个版本中的排序方式,我们首先根据tie-breaker排序,然后再根据主要标准排序。
对于第一个版本,如果该标准是数值型的,我们可以通过将其乘以-1来按照两个标准中的一个递减顺序进行排序。
l.sort(key=lambda x: (x[0], -x[1]))
然而,使用第二个版本,我们可以按照其中一个标准的降序排序,使用可选参数 reverse=True
,这适用于数字以及其他类型,例如字符串。
l.sort(key=lambda x: x[1], reverse=True)
l.sort(key=lambda x: x[0])
最后,需要注意的是,您可以使用operator.itemgetter
或operator.attrgetter
来作为排序键,而不是使用def
或lambda
定义自定义函数。
例如,以下两个代码片段是等价的:
l.sort(key=lambda x: (x[0], x[1]))
from operator import itemgetter
l.sort(key=itemgetter(0, 1))
以下三个代码片段等效:
def mykey(x):
x1 = x.attribute1
x2 = x.attribute2
return (x1, x2)
l.sort(key=mykey)
l.sort(key=lambda x: (x.attribute1, x.attribute2))
from operator import attrgetter
l.sort(key=attrgetter('attribute1', 'attribute2'))