만족은 하되 안주하지는 말자

기록해야 기억한다

프로그래밍/기억노트

[python] list 여러 조건으로 정렬하기 (sort by multiple field,attribute)

D36choi 2020. 9. 11. 11:26
728x90

www.acmicpc.net/problem/10825

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1

www.acmicpc.net

 

이 문제를 풀며 확실히 기억해야 할 부분이라 싶어 정리한다.

 

list 의 각 item이 field가 1개 이상인 tuple 이라고 하면 다양한 조건으로 정렬하고 싶을 때가 있을 것이다.

 

(사람이름, 국어점수, 영어 점수, 수학 점수) 가 한 item 이라면

위 문제처럼

1. 국어 점수 내림차순 

2. 영어 점수는 오름차순

3. 수학 점수는 내림 차순

4. 모든 점수가 같으면 이름의 오름 차순

 

를 모두 접목해 정렬하고 싶을 수 있다.

 

어떻게?

sort() 함수의 key parameter 를 lambda 식을 이용해 해결 한다.

 

lambda 식은 Runtime 익명 함수다. 즉 실행될 때 생성되었다가 실행이 끝나면 버려지는 함수인 것이다.

 

arr.sort(key= lambda x: (-x[1],x[2],-x[3],x[0]))

lambda x 에 (여기서 x는 어떤 이름을 사용해도 좋다) 매핑되는 것은 list 의 각 item 인 (사람이름, 국어점수, 영어 점수, 수학 점수) 이다.

위 조건 1,2,3,4 가 왼쪽 -> 오른쪽 순서대로 매핑된다.

 

' -x[1] ' 은 각 item 의 2번째 속성을 내림 차순으로 정렬한다 를 의미 한다.

그 뒤의 x[2] 는 앞의 정렬조건에서 동일한 아이템들에 대해 오름 차순으로 정렬한다.

 

그 뒤도 같은 의미를 지닌다.