3

假设我们有一个包含 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)

将按所有字段的降序对列表进行排序。我正在寻找的是对不同字段的不同顺序的列表进行排序。有没有一种简单的方法可以做到这一点。

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

谢谢,古吉

4

2 回答 2

9

如果值是数字,您可以使用以下方法轻松完成此操作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))

我在这个答案中更深入地解释它。

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

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 :-)
于 2012-08-16T18:18:54.923 回答
1

您可以创建一个具有有意义的属性名称的类,而不仅仅是数字索引;如果你给它__cmp__(python 2.x)或__eq__加上__lt__@total_ordering(python 3.x),那将很容易排序。

另一种选择是保留元组,将它们转换为列表,并否定您需要反向排序的任何数字字段。您可以对字符串执行此操作,但不如数字那么整洁。

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

于 2012-08-16T18:23:42.197 回答