如何对一个多维数组进行排序,其中一列按升序排列,另一列按降序排列?

3

我的问题是关于Python中的二维列表排序,不允许使用第三方工具包。

假设有一个二维列表Students,其中存储了一些学生的信息,第一列是id,第二列是name,第三列是age。您需要按照age作为第一关键字以降序排序,而按照name作为第二关键字以升序排序,也就是说,如果studentAstudentB年龄相同,则按照name以升序排序。

参考代码如下:

students = [[3 , 'Jack' , 12] , [2 , 'Rose' , 13] , [1 , 'Tom' , 10] , [5 , 'Sam' , 12] , [4 , 'Joy' , 8]]
print(f"according to age as first keyword,name as second keyword in reverse order:\
{sorted(students , key=(lambda x: [x[2] , x[1]]) , reverse=True)}")

输出结果为

[[2, 'Rose', 13], [5, 'Sam', 12], [3, 'Jack', 12], [1, 'Tom', 10], [4, 'Joy', 8]]

但期望的结果是

[[2, 'Rose', 13],  [3, 'Jack', 12], [5, 'Sam', 12], [1, 'Tom', 10], [4, 'Joy', 8]]

我们要如何修改代码才能得到正确的结果? 非常感谢。

2个回答

2

您可以使用 key,但需要做出一点改变,使用 - 表示“降序”(负数总是在升序排序中排在正数之前)。因此,您根本不需要使用 reverse 参数。

>>> sorted(students, key = lambda x:(-x[2], x[1]))
[[2, 'Rose', 13], [3, 'Jack', 12], [5, 'Sam', 12], [1, 'Tom', 10], [4, 'Joy', 8]]

1

尝试这个:

import operator 
list1 = sorted(students, key=operator.itemgetter(2), reverse=True)
print(list1)

它也起作用了,谢谢你的回答。然而,它仅按照一列进行排序。例如如果我们将输入更改为students = [[5, 'Sam', 12], [3, 'Jack', 12], [2, 'Rose', 13], [1, 'Tom', 10], [4, 'Joy', 8]],它就无法产生预期的答案。 - nicolas chan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接