본문 바로가기

프로그래밍

[Python][Algorithm] Find Index Before Sorted

Sorted by key

정렬을 하다 정렬 전의 인덱스를 역으로 찾아야 하는 경우가 생겼습니다.

만일 정렬을 통해 최솟값이 맨 처음으로 왔다면 그 최솟값은 기존 리스트에서 어떤 인덱스에 있었을까요?

리스트를 다루는 유용한 기능인 sorted key를 통해서 이에 대한 방법을 설명하겠습니다.

이 방법은 메모리를 추가적으로 사용하기 때문에 최선의 방법이라고 할 수 없을 것 같습니다.

 

# 성적과 그에 해당하는 사람들의 수를 두 개의 리스트에 각각 담았다고 합시다.
 
Score_of_people = ["A0""C0""B0""F""A+"]
 
Number_of_people = [10, 40, 30, 20, 50]
 
 

 

두 개의 리스트를 합친 리스트를 만듭니다. 

ALL 이라고 별칭을 하겠습니다. 리스트의 원소는 튜플 타입입니다. 

 

 
# 1. 먼저 편의를 위해 리스트 별칭을 해주고 리스트를 합쳐줍니다.
 
= Score_of_people
 
= Number_of_people
 
ALL1 = [ ( S[ i ], N [ i ] ) for i in range( len(S) ) ]
 
 
PRINT ----------------------------------------------------------
 
ALL1 >>>  [ ('A0'10), ('C0'40), ('B0'30), ('F0'20), ('A+'50) ]
 

이렇게 두 개의 원소를 모두 담고 있는 새로운 리스트를 생성하고 

튜플의 원소를 비교해서 정렬을 할 수 있습니다. 

따라서 두 가지 정렬이 가능합니다. 

1. Score A, B, C, F 를 정렬한다.

2. Number 10, 40, 30, 20 을 정렬한다. 

 

1번의 경우가 key 1 에 해당하고 2번이 key 2 에 해당합니다.

 

 

ALL2 = sorted(ALL1, key = lambda x: x[0])
ALL3 = sorted(ALL1, key = lambda x: x[1])
 
PRINT ----------------------------------------------------------
 
ALL2 >>> sorted by key 0 Score  [('A+'50), ('A0'10), ('B0'30), ('C0', 40), ('F0'20)]
ALL3 >>> sorted by key 1 Number [('A0'10), ('F0'20), ('B0'30), ('C0'40), ('A+'50)]
 

sorted(LST, key = lamda x: x[?] ) 를 통해서 Tuple의 인덱스에 대한 비교로 정렬을 할 수 있습니다. 

 

* 주의사항 : sorted 함수는 리스트를 정렬해주지만, 정확히 말하면 정렬된 리스트를 반환해 주는 함수입니다.

 

이 방법을 통해서 기존 인덱스를 참조하는 정렬을 만들 수 있습니다.  

# INDEX PROBLEM
 
Mylst = [20,30,40,10,20,30,30]
 
Mylst = [ (Mylst[i], i) for i in range( len(Mylst) ) ]
Mylst = sorted(Mylst, key=lambda x: x[0])
 
 
print("With Index before sortd ", Mylst)
 
Console ----------------------------------------------------------
 
With Index before sortd  [(10, 3), (20, 0), (20, 4), (30, 1), (30, 5), (30, 6), (40, 2)]
 

 

Mylst = [20,30,40,10,20,30,30]

[(10, 3), (20, 0), (20, 4), (30, 1), (30, 5), (30, 6), (40, 2)]

10 -- > 3번 째

20 -- > 0번 째

기타 등등...

 

끝.