Python 使用自定义键对二维列表进行排序

Python Sorting 2D List with custom Key

所以我有一个二维列表,想使用第二个键文件对其进行排序。有谁知道我会怎么做?

这是一个示例输入:

And here is an example input file:

first_nm,last_nm,gender,cwid,cred_hrs,qual_pts,gpa
John,Roe,M,44444444,40,150,3.75
Jane,Roe,F,66666666,100,260,2.6
John,Doe,M,22222222,50,140,2.8
Jane,Doe,F,88888888,80,280,3.5
Penny,Lowe,F,55555555,40,140,3.5
Lenny,Lowe,M,11111111,100,280,2.8
Denny,Lowe,M,99999999,80,260,3.25
Benny,Lowe,M,77777777,120,90,0.75
Jenny,Lowe,F,33333333,50,90,1.8
Zoe,Coe,F,0,50,130,2.6

这里是排序的关键(可以多也可以少,取决于你想如何排序)

gender,ascend,string
gpa,descend,float
last_nm,ascend,string

下面是该输入和键的输出:

first_nm,last_nm,gender,cwid,cred_hrs,qual_pts,gpa
Jane,Doe,F,88888888,80,280,3.5
Penny,Lowe,F,55555555,40,140,3.5
Zoe,Coe,F,00000000,50,130,2.6
Jane,Roe,F,66666666,100,260,2.6
Jenny,Lowe,F,33333333,50,90,1.8
John,Roe,M,44444444,40,150,3.75
Denny,Lowe,M,99999999,80,260,3.25
John,Doe,M,22222222,50,140,2.8
Lenny,Lowe,M,11111111,100,280,2.8
Benny,Lowe,M,77777777,120,90,0.75

我正在考虑只使用内置的 sort(),但不确定如果我在 3 次不同的时间进行排序,我是否能够使用它。我想我必须向后排序? (last_nm,然后是 gpa,然后是性别)

您可以 return 来自关键函数的元组来创建复杂的排序。作为一个快速技巧,将数值乘以 -1 进行反向排序。你的例子看起来像这样:

lists.sort(key = lambda x: (x[2], x[6] * -1, x[1]))

list sort() 方法接受一个布尔参数reverse,但它适用于整个键;您不能说您希望键的某些部分使用升序排序而其他部分使用降序排序。遗憾的是,没有一种简单的方法可以将 g.d.d.c 乘以 -1 的技巧扩展到非数字数据。

因此,如果您需要处理升序和降序的任意组合,那么是的,您将不得不多次排序,向后处理您的键列表,就像您在问题中提到的那样。内置的 Python 排序算法 timsort 是一种稳定的排序,这意味着每次您使用不同的键对 2D 列表进行排序时,之前的排序结果不会被打乱。