Python으로 코딩하다보면 2차원 list를 column에 따라 정렬할 일이 생긴다.
예를 들어 다음과 같은 list가 있다고 하자
score = [
['A', 89],
['B', 100],
['C', 85],
['D', 93]
]
ABCD의 점수를 나타낸 배열을 점수의 순서대로 정렬을 해야할 경우에는 간단하게 다음과 같이 정렬하면 된다.
import operator
score = sorted(score, key=lambda x:x[1])
score = sorted(score, key=operator.itemgetter(1))
sorted()
의 'key' 파라미터는 각 list element에 비교 연산을 수행하기 전에 수행하는 함수를 받는다.
lambda
함수나 operator.itemgetter()
함수는 리스트에서 1번째 인덱스를 반환하는 역할을 수행하기 때문에 비교연산 이전에 1번째 인덱스의 값만을 갖고 비교를 수행하는 것이다.
두가지 column에 대해서 모두 정렬할 때도 마찬가지이지만 key함수에 따라 미묘한 차이점이 있다.
>>> a
[(1, 2), (0, 1), (5, 2), (5, 1), (3, 0)]
>>> sorted(a)
[(0, 1), (1, 2), (3, 0), (5, 1), (5, 2)]
>>> sorted(a, key=lambda x: x[0])
>>> sorted(a, key=operator.itemgetter(0))
[(0, 1), (1, 2), (3, 0), (5, 2), (5, 1)]
>>> sorted(a, key=lambda x: (x[1], x[0]))
>>> sorted(a, key=operator.itemgetter(1,0))
[(3, 0), (0, 1), (5, 1), (1, 2), (5, 2)]
>>> sorted(a, key=lambda x: (-x[1], x[0]))
[(1, 2), (5, 2), (0, 1), (5, 1), (3, 0)]
sorted(a)
는 기본적인 정렬로 0번 인덱스에 대해서 정렬하고, 1번 인덱스에 대해서 정렬한다.sorted(a, key=lambda x: x[0])
는 0번 인덱스에 대해서만 정렬한다. Python에 내장된 정렬 함수는 Stable하기 때문에 같은 값에 대해서는 원래 입력의 순서가 유지가 돼서 처음 입력인 (5,2), (5,1)
순서가 유지된다.sorted(a, key=lambda x: (x[1], x[0]))
는 먼저 1번 인덱스에 대해서 정렬하고 0번 인덱스에 대해서 정렬한 것이다.sorted(a, key=lambda x: (-x[1], x[0]))
는 1번 인덱스에 대해서 역순으로 먼저 정렬을 하고 0번 인덱스에 대해서 정렬한 것이다.