在元组中使用- attribute2
而不是attribute2
是最简单的方法
如果attribute2
是一个字符串,或者不能以有意义的方式乘以-1
,那么这个技巧就不起作用.
但是,请注意,在python中,lst.sort
和sorted
保证是stable个排序.特别是,这意味着以下两个代码段是等效的:
# SORT ACCORDING TO A TUPLE
l.sort(key=lambda x: (x[0], x[1]))
# SORT TWICE
l.sort(key=lambda x: x[1])
l.sort(key=lambda x: x[0])
请注意,在第二个版本中,我们首先按照平局 destruct 者进行排序,然后按照主要标准进行排序.
对于第一个版本,如果该标准是数字的,我们可以将其乘以-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
定义自定义函数作为排序键.
例如,以下两个代码段是等效的:
# FIRST VERSION
l.sort(key=lambda x: (x[0], x[1]))
# SECOND VERSION
from operator import itemgetter
l.sort(key=itemgetter(0, 1))
以下三个代码段是等效的:
# FIRST VERSION
def mykey(x):
x1 = x.attribute1
x2 = x.attribute2
return (x1, x2)
l.sort(key=mykey)
# SECOND VERSION
l.sort(key=lambda x: (x.attribute1, x.attribute2))
# THIRD VERSION
from operator import attrgetter
l.sort(key=attrgetter('attribute1', 'attribute2'))