2015-02-06 1 views
1

그래서 2D 목록이 있고 두 번째 키 파일을 사용하여 정렬하려고합니다. 아무도 내가 그 일을 어떻게 할 것인지 알고 있니?Python 2D 키 목록을 사용자 정의 키로 정렬

Heres는 예를 들어 입력 : 여기

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()를 사용하려고 생각했지만 n 내가 3 개의 다른 시간을 분류하는 경우에 나는 그것을 사용할 수 있는지 확실하다. 내가 거꾸로 정렬해야 할 것 같아? (last_nm, gpa, 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 목록의 한 행을 넘겨주는 함수이며, 요소 6에 -1을 곱하고 요소 1을 반환합니다.'sort()'는이 튜플을 행의 값이 아닌 정렬 할 키로 사용합니다. 정렬을 수행하기 위해 키를 여러 번 검사해야하는 경우에도 각 행의 키는 한 번만 계산되므로이 키 변환 작업은 매우 효율적입니다. –

0

목록 정렬을() 메소드는 부울 매개 변수 reverse이 필요하지만이 모든 키에 적용; 키의 일부분을 오름차순으로 사용하고 다른 부분에서는 내림차순으로 사용하기를 원한다고 말할 수는 없습니다. 안타깝게도, g.d.d.c의 -1로 곱하는 트릭을 비 숫자 데이터로 확장하는 간단한 방법은 없습니다.

그렇다면 오름차순과 내림차순의 임의의 조합을 처리해야하는 경우 질문에서 언급 한 것처럼 키 목록을 거꾸로 작업하면서 여러 번 정렬해야합니다. 내장 된 Python 정렬 알고리즘 timsort은 안정적인 정렬입니다. 즉, 이전 정렬 결과가 스크램블되지 않는 다른 키로 2D 목록을 정렬 할 때마다이를 의미합니다.