Intro

 

코드를 보다가, A를 거친 점수와 B를 거친 점수를 가지고 순위를 매기는 과정이 있었다.

 

 

A를 거친 점수를 기준으로 오름차순을 한 뒤, 다시 그 결과에 대해 B를 거친 점수를 기준으로 오름차순을 진행해 순위를 매기는 것이었다.

 

 

이렇게 여러 번의 정렬을 수행해야 될 때 어떻게 하는지 알아보도록 하자.

 

 

 

 

 

 

Python에서의 다중 정렬(sorted 이용)

 

 

1. 데이터의 순위를 index로 반환하도록 만드는 경우

 

# 점수를 scores라는 list로 생성
scores = [[1, 2], [6, 5], [5, 4], [5, 8], [7, 1], [10, 5]]

rank = sorted(range(len(scores)), key = lambda x: (scores[x][0], scores[x][1]), reverse = True)
print(rank)

 

먼저 점수를 scores라는 list로 만들어줍니다. 

 

 

[5, 4]와 [5, 8]을 넣어 다중 정렬이 시행되는지를 확인하고자 하였습니다.

 

 

최종 순위를 매길 때는, sorted를 사용해주고, 이때 첫 번째 인자는 반드시 iterable 한 object가 들어가야 합니다.

 

 

안 그러면 TypeError가 발생하니 주의해야 합니다.

 

 

range(len(scores)) 대신, 6을 넣으면 해당 오류를 직접 확인하실 수 있습니다.

 

 

 

 

key라고 하는 인자는, "어떤 것을 기준으로 정렬할까?"를 결정하는 역할을 합니다. 이때, 기준이 여러 개이면 첫 번째부터 순서대로 기준을 적용해줍니다.

 

 

그리고 key는 첫 번째 인자를 input으로 받아서 작동합니다.

 

 

위의 예시에서는, 먼저 range(len(scores))에서 첫 번째로 나오는 0부터 input으로 받게 되며 scores[0][0]을 기준으로 먼저 정렬해줍니다. 다음으로 scores[0][1]을 기준으로 다시 정렬해줍니다.

 

 

그다음으로는 range(len(scores))의 다음 값인 1을 input으로 받고, scores[1][0]을 기준으로 먼저 정렬한 뒤, scores[1][1]을 기준으로 다시 정렬해주겠죠?

 

 

이런 방식으로 range의 마지막 값까지 진행됩니다.

 

 

reverse = True를 지정하면, 내림차순으로 바뀝니다. (reverse = False가 default 값이고, 따로 설정을 하지 않으면 오름차순이 진행됩니다.)  

 

 

 

 

 

위 예시를 실제로 돌리면, 다음과 같은 결과가 나오게 됩니다.

 

[5, 4, 1, 3, 2, 0]

 

먼저 첫 번째 요소를 기준으로 내림차순을 진행합니다.

 

[[1, 2], [6, 5], [5, 4], [5, 8], [7, 1], [10, 5]] 이므로, 순서는 5, 4, 1, (2, 3), 0이 됩니다.

 

첫 번째 요소가 5로 같기 때문에, 2번째와 3번째 값은 순위를 매길 수 없습니다. 따라서 (2, 3)로 표기하였습니다.

 

다음으로, 두 번째 요소를 기준으로 내림차순을 진행합니다.

 

[5, 4], [5, 8] 중에서 [5, 8]이 더 크기 때문에, 더 높은 순위를 받게 됩니다.

 

따라서 정답이 [5, 4, 1, 3, 2, 0]이 되는 것이죠.

 

 

 

2. 데이터의 순위를 데이터 값 자체로 반환하도록 만드는 경우

 

scores = [[1, 2], [6, 5], [5, 4], [5, 8], [7, 1], [10, 5]]

rank = sorted(scores, key = lambda x: (x[0], x[1]), reverse = True)
print(rank)

점수 데이터는 위와 동일하게 사용해주고, 그 대신 sorted를 해주는 대상을 바꿨습니다.

 

아까는 range(len(scores))로 지정하여 scores의 index인 0부터 5까지를 key의 input으로 사용했지만, 이번에는 scores값 자체를 key의 input으로 사용합니다.

 

따라서, 정렬한 결과도 scores값이 직접 나오게 됩니다.

 

print(rank)의 결과는 다음과 같습니다.

 

 

[[10, 5], [7, 1], [6, 5], [5, 8], [5, 4], [1, 2]]

 

첫 번째 예시에서는 score 값들의 index가 나왔다면, 이번에는 score 값 그 자체로 정렬이 되었습니다.

 

 

 

 

 

 

 

결론(Conclusion)

 

 

1. sorted()에는 정렬을 하는 기준을 설정해주는 'key'라는 인자가 존재한다.

 

2. key는 sorted의 첫 번째 인자를 input으로 받는다.

 

3. 만약 key로 두 개를 지정해주면, 첫 번째 값을 기준으로 정렬해주고, 다음으로는 두 번째 값을 기준으로 재 정렬해준다.

 

 

 

참고자료

docs.python.org/ko/3/howto/sorting.html

+ Recent posts