使用不同字段的不同顺序对python中的元组进行排序

Sorting tuples in python using different orders for different fields

本问题已经有最佳答案,请猛点这里访问。

假设我们有5个元组的列表:

1
(a, b , c, d, e)

让列表成为学生列表。

我希望对列表按不同字段的不同顺序进行排序。

下面提到的命令

1
sorted(student_tuples, key=itemgetter(2,4,0,1))

将按升序对所有字段的列表排序。

下面提到的命令

1
sorted(student_tuples, key=itemgetter(2,4,0,1), reverse=true)

将按降序对所有字段的列表排序。我要找的是按不同字段的不同顺序对列表进行排序。有简单的方法吗?

根据答案,该技术可用于任何语言。

谢谢,格吉


如果值是数字,则可以使用lambda轻松完成此操作:

1
2
3
sorted(student_tuples, key=lambda x: (x[2],x[4],-x[0],x[1]))
                                                #^ This field will be
                                                #  in descending order

如果您不能轻易地否定lambda函数中的顺序,则需要依赖于python排序的稳定性并进行几次排序:

1
2
3
s = sorted(student_tuples, key=itemgetter(1))
s.sort(key=itemgetter(0),reversed=True)
s.sort(key=itemgetter(2,4))

我在这个答案中对它作了更深入的解释。

证明以上答案完成了相同的事情(使用数字输入):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 :-)


您可以创建一个具有有意义的属性名的类,而不仅仅是数字索引;如果您给它指定__cmp__(python 2.x)或__eq____lt__加上@total ou ordering(python 3.x),这将很容易排序。

另一种选择是保留元组,将它们转换为列表,并对需要反向排序的任何数值字段求反。你可以对字符串这样做,但它不像数字那样整洁。

元组排序快的部分原因是它们不是超级灵活的。