参见英文答案 > How to write Python sort key functions for descending values 6个
假设我们有一个5元组的列表:
(a, b , c, d, e)
让列表成为student_tuples.
我希望对列表排序不同字段的不同订单.
下面提到的命令
sorted(student_tuples, key=itemgetter(2,4,0,1))
将按所有字段的升序对列表进行排序.
下面提到的命令
sorted(student_tuples, key=itemgetter(2,4,0,1), reverse=true)
将按降序对所有字段对列表进行排序.
我正在寻找的是为不同的字段排序不同订单的列表.
有没有一种简单的方法可以做到这一点.
根据答案,该技术可用于任何语言
谢谢,
Gudge
解决方法:
如果值是数字,则可以使用lambda轻松完成:
sorted(student_tuples, key=lambda x: (x[2],x[4],-x[0],x[1]))
#^ This field will be
# in descending order
如果你不能轻易否定lambda函数内的顺序,你需要依赖python排序的稳定性并排序几次:
s = sorted(student_tuples, key=itemgetter(1))
s.sort(key=itemgetter(0),reversed=True)
s.sort(key=itemgetter(2,4))
我在this answer更深入地解释它.
证明我上面的答案完成了相同的事情(使用数字输入):
import random
def rand_tuple():
""" Return a random 5-tuple """
return tuple( random.random() for _ in range(5) )
#100 random 5-tuples
lst = [ rand_tuple() for _ in range(100) ]
#sort the list using method 1
sorted_lst = sorted(lst, key = lambda x: (x[2],x[4],-x[0],x[1]))
#sort the list in place using method 2
lst.sort(key = itemgetter(1)) #<- Rightmost tuple element first!!!
lst.sort(key = itemgetter(0), reversed = True)
lst.sort(key = itemgetter(2,4))
print (lst == sorted_lst) #True -- Results are the same :-)