데이터과학 삼학년

리스트 정렬 (multiple key를 이용한 정렬) 본문

Python

리스트 정렬 (multiple key를 이용한 정렬)

Dan-k 2021. 9. 22. 20:52
반응형

파이썬 리스트에서 멀티플한 key로 정렬하는 방법에 대해 알아본다

lambda를 이용해 여러 키를 tuple로 받게 해주면 된다.

즉, tuple의 순서에 따라 순서대로 정렬 된다.

s = [
	[12, 'tall', 'blue', 1],
	[2, 'short', 'red', 9],
	[4, 'tall', 'blue', 13]
    ]

#1번 인덱스 오름차순, 0번 인덱스로 오름차순 정렬
s = sorted(s, key = lambda x: (x[1], x[3]))  
print(s)
[
[2, 'short', 'red', 9], 
[12, 'tall', 'blue', 1], 
[4, 'tall', 'blue', 13]
]


#1번 인덱스 오름차순, 3번 인덱스로 내림차순 정렬
s = sorted(s, key = lambda x: (x[1], -x[3])) 
print(s)
[
[2, 'short', 'red', 9], 
[4, 'tall', 'blue', 13], 
[12, 'tall', 'blue', 1]
]

 

멀티플 키를 이용한 정렬 문제 예시

문제 설명복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요.
  1. 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
  2. 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
  3. 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
  4. 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.
def solution(weights, head2head):
    answer, win_rate, win_cnt_weight = [], [], []
    cnt, temp_win_cnt = 0, 0
    for i,j in zip(weights, head2head):
        temp_j = j.replace("N","")
        if temp_j == "": 
            win_rate.append(0)
        else:
            win_rate.append(temp_j.count('W') / len(temp_j))
        for ind, win_result in enumerate(j):
            if win_result == "W":
                if weights[cnt] < weights[ind]:
                    temp_win_cnt += 1
        win_cnt_weight.append(temp_win_cnt)
        temp_win_cnt = 0
        cnt += 1
    sort_key = [(ind+1, k[0],k[1],k[2]) for ind, k in enumerate(zip(win_rate, win_cnt_weight,weights))]
    sort_key.sort(key=lambda x:(-x[1],-x[2],-x[3],x[0]))
    print('sort_key:', sort_key)
    return [i[0] for i in sort_key]

  
weights, head2head, result = [50,82,75,120],["NLWL","WNLL","LWNW","WWLN"],[3,4,1,2]
solution(weights, head2head)
# sort_key: [(3, 0.6666666666666666, 2, 75), (4, 0.6666666666666666, 0, 120), (1, 0.3333333333333333, 1, 50), (2, 0.3333333333333333, 0, 82)]
# [3, 4, 1, 2]

 

728x90
반응형
LIST
Comments