Language/Python

[Python] Python에서 정렬하는 방법 (sort, sorted, heapq)

Joonfluence 2023. 10. 11.

파이썬으로 코딩 테스트 문제를 풀다보면, 다양한 상황에서 정렬을 활용해야 합니다. 문제를 손쉽게 풀 수 있도록 도와줬던 sort/sorted 함수 활용 방법에 관해 알아보겠습니다.

sort 함수를 활용한 정렬 방법 이용하기

내장함수 리스트.sort 함수 사용 혹은 sorted(리스트) 함수 사용하면 쉽게 정렬할 수 있습니다. 두 함수 간 차이점은 전자는 원본 리스트에 수정이 일어나고, 후자는 수정이 일어나지 않는다는 점입니다. 또한 기본적으로 오름차순으로 정렬됩니다.

numbers = [5, 3, 2, 3]
numbers.sort() # None 값 리턴
print(numbers) # [2, 3, 3, 5] (원본 배열이 변경됨)

new_numbers = sorted(numbers) # 새로운 배열 리턴
print(numbers) # [5, 3, 2, 3]
print(new_numbers) # [2, 3, 3, 5]

내림차순 정렬 방법

내림차순으로 정렬하기 위해선 리스트.sort(reverse=True) 사용 혹은 sorted(리스트, reverse=True) 사용하면 됩니다.

커스텀 함수 활용 방법

sorted 함수 사용 및 functools import 한 후, functools.com_to_key 함수를 두번째 인자 값으로 넣어준다.

import functools
sorted(리스트, key=functools.cmp_to_key(비교함수))

람다 함수 활용하기

정렬을 목적으로 하는 함수를 값으로 넣는다. lambda를 이용할 수 있습니다. key 값을 기준으로 정렬됩니다. 기본 정렬은 오름차순입니다.

numbers = [5, 3, 2, 3]
numbers.sort(key = lambda x : x%3) # 결과값인 2 0 2 0 으로 정렬

딕셔너리 혹은 튜플 정렬하기

정렬하려는 원소가 key와 value로 구성된 딕셔너리 형태일 수 있습니다. 또는 튜플 형태일 수 있습니다. 그럴 땐, 기준이 되는 원소를 하나 혹은 여러개로 지정해줄 수 있습니다.

number_tuples = [(4, 5), (1, 3), (5, 2), (3, 3)]
number_tuples.sort(key=lambda x: (x[1], x[0])) # (1, 3) (3, 3) (4, 5) (5, 2)

앞에 위치하면 더 높은 우선순위를 부여 받아, 해당 원소 기준으로 정렬한 뒤 그 다음 순서 원소를 기준으로 정렬합니다.

heapq를 사용하는 방법

한번만 정렬해도 되면 sort 함수를 사용하면 됩니다. 하지만 반복적으로 값을 넣었다 빼야 하는 상황도 존재합니다. 이 경우에는 heap을 사용하는 것이 좋습니다. heappush된 원소를 heappop을 통해 자동으로 정렬된 상태로 반환되기 때문입니다.

def heapsort(iterable):
    h = []
    for value in iterable:
        heappush(h, value)
    return [heappop(h) for i in range(len(h))]

heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
반응형

댓글