Python使用自定义键对2D列表进行排序

时间:2015-02-06 02:41:58

标签: python list sorting 2d

所以我有一个2D列表,想要使用第二个密钥文件对其进行排序。有谁知道我会怎么做呢?

下面是一个示例输入:

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,然后是性别)

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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