Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 리스트에서 요소의 상대적 순서(순위) 구하는 방법

개요

정수로 이루어진 리스트가 주어졌을 때, 각 요소의 상대적 순서(relative order)를 구해야 하는 경우가 있습니다. 여기서 상대적 순서란, 리스트를 오름차순으로 정렬했을 때 각 요소가 차지하게 될 인덱스 위치를 의미합니다.

예를 들어 [78, 14, 0, 11]이라는 리스트가 있다면, 오름차순으로 정렬하면 [0, 11, 14, 78]이 되므로 각 요소의 상대적 순서는 [3, 2, 0, 1]이 됩니다. 이번 글에서는 이를 구현하는 두 가지 방법을 살펴보겠습니다.

방법 1: sorted()와 index() 활용하기

가장 직관적인 방법은 먼저 전체 리스트를 정렬한 뒤, 원본 리스트의 각 요소가 정렬된 리스트에서 몇 번째 인덱스에 위치하는지 찾는 것입니다.

예제 코드

listA = [78, 14, 0, 11]
# 원본 리스트 출력
print("Given list is : \n", listA)
# sorted()와 index() 사용
res = [sorted(listA).index(i) for i in listA]
# 결과 출력
print("list with relative ordering of elements : \n", res)

실행 결과

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

Given list is :
[78, 14, 0, 11]
list with relative ordering of elements :
[3, 2, 0, 1]

결과를 해석해 보면, 가장 작은 값인 0은 정렬 시 인덱스 0에 위치하고, 11은 인덱스 1, 14는 인덱스 2, 78은 인덱스 3에 해당합니다.

방법 2: enumerate()와 sorted() 활용하기

index() 메서드는 호출될 때마다 리스트를 처음부터 순차적으로 탐색하므로, 요소 수가 많아지면 성능이 크게 저하됩니다(시간 복잡도 O(n²)). 대신 enumerate()sorted()를 조합해 딕셔너리를 만들면 훨씬 효율적입니다.

정렬된 리스트를 enumerate()로 순회하며 {값: 순위} 형태의 딕셔너리를 생성하고, map() 함수를 이용해 원본 리스트의 각 요소에 대응하는 순위를 한 번에 조회합니다.

예제 코드

listA = [78, 14, 0, 11]
# 원본 리스트 출력
print("Given list is : \n", listA)
# sorted()와 enumerate() 사용
temp = {val: key for key, val in enumerate(sorted(listA))}
res = list(map(temp.get, listA))
# 결과 출력
print("list with relative ordering of elements : \n", res)

실행 결과

위 코드를 실행하면 첫 번째 방법과 동일한 결과를 얻을 수 있습니다.

Given list is :
[78, 14, 0, 11]
list with relative ordering of elements :
[3, 2, 0, 1]

마무리

두 방법 모두 동일한 결과를 반환하지만, 내부 동작 방식의 차이로 성능에는 큰 차이가 있습니다. 딕셔너리 조회는 O(1)이므로 두 번째 방법의 전체 시간 복잡도는 정렬에 드는 O(n log n)에 그칩니다. 따라서 데이터 크기가 클수록 enumerate() + sorted() 조합을 사용하는 것이 바람직합니다.