2015-02-06 2 views
1

Итак, у меня есть 2D-список и вы хотите отсортировать его, используя второй файл ключей. Кто-нибудь знает, как я буду это делать?Python Сортировка 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 

Я думал только об использовании встроенного сортировки(), но был n Конечно, если я смогу использовать его, если сортирую 3 раза. Думаю, мне пришлось бы отступить назад? (last_nm, then gpa, then gender)

ответ

1

Вы можете вернуть кортеж из своей ключевой функции для создания сложных видов. И как быстрый трюк, умножьте числовые значения на -1 для обратного сортировки. Ваш пример будет выглядеть примерно так:

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

Я думаю, вы пропустили закрытие кронштейна. –

+0

@ AvinashRaj - Так я и сделал. Исправлена. –

+1

@ncerice: lambda x: (x [2], x [6] * -1, x [1]) '- это функция, которая получает строку вашего 2D-списка и возвращает кортеж, состоящий из элемента 2 строка, элемент 6, умноженная на -1, и элемент 1. 'sort()' использует этот кортеж как ключ для сортировки, а не значение строки. Ключ для каждой строки вычисляется только один раз, хотя ключи необходимо проверять несколько раз для выполнения сортировки, поэтому эта операция преобразования ключей довольно эффективна. –

0

списка критериев сортировки() метод принимает булево значение reverse, но это относится ко всему ключу; вы не можете сказать, что хотите, чтобы некоторые части ключа использовали сортировку по возрастанию, а другие - по убыванию. К сожалению, нет простого способа расширить трюк g.d.d.c по умножению на -1 на нечисловые данные.

Так что если вам нужно обрабатывать произвольные комбинации восходящего и нисходящего, то да, вам придется сортировать несколько раз, работая в обратном направлении по списку ключей, как вы упомянули в своем вопросе. Встроенный алгоритм сортировки Python, timsort, является стабильным, что означает, что каждый раз, когда вы сортируете свой 2D-список с другим ключом, предыдущие результаты сортировки не будут скремблированы.

Смежные вопросы