[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개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN