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

时间:2012-08-16 18:08:16

标签: python sorting tuples

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

2 个答案:

答案 0 :(得分:8)

如果值是数字,您可以使用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 :-)

答案 1 :(得分:1)

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

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

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