[Python] 2차원 list 정렬

정재경·2021년 6월 13일
1

Python

목록 보기
1/2

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)]
  1. sorted(a) 는 기본적인 정렬로 0번 인덱스에 대해서 정렬하고, 1번 인덱스에 대해서 정렬한다.
  2. sorted(a, key=lambda x: x[0])는 0번 인덱스에 대해서만 정렬한다. Python에 내장된 정렬 함수는 Stable하기 때문에 같은 값에 대해서는 원래 입력의 순서가 유지가 돼서 처음 입력인 (5,2), (5,1)순서가 유지된다.
  3. sorted(a, key=lambda x: (x[1], x[0]))는 먼저 1번 인덱스에 대해서 정렬하고 0번 인덱스에 대해서 정렬한 것이다.
  4. sorted(a, key=lambda x: (-x[1], x[0]))는 1번 인덱스에 대해서 역순으로 먼저 정렬을 하고 0번 인덱스에 대해서 정렬한 것이다.

References

Python Docs
Blog

profile
You'll see what I've become.

0개의 댓글