아래의 데이터를 grade, score 순으로 정렬하려고 한다.

scores = [
	{'no': 1, 'grade': 1, 'score': 30},
	{'no': 2, 'grade': 1, 'score': 42},
	{'no': 3, 'grade': 2, 'score': 75},
	{'no': 4, 'grade': 3, 'score': 80},
	{'no': 5, 'grade': 2, 'score': 40},
	{'no': 6, 'grade': 5, 'score': 14},
	{'no': 7, 'grade': 4, 'score': 94},
	{'no': 8, 'grade': 2, 'score': 100},
	{'no': 9, 'grade': 1, 'score': 24},
	{'no': 10, 'grade': 2, 'score': 55},
]

sort 메서드를 두번쓰면 될까?

scores.sort(key=lambda item: item['grade'])
scores.sort(key=lambda item: item['score'])
    
print(*scores, sep='\n')
{'no': 6, 'grade': 5, 'score': 14}
{'no': 9, 'grade': 1, 'score': 24}
{'no': 1, 'grade': 1, 'score': 30}
{'no': 5, 'grade': 2, 'score': 40}
{'no': 2, 'grade': 1, 'score': 42}
{'no': 10, 'grade': 2, 'score': 55}
{'no': 3, 'grade': 2, 'score': 75}
{'no': 4, 'grade': 3, 'score': 80}
{'no': 7, 'grade': 4, 'score': 94}
{'no': 8, 'grade': 2, 'score': 100}

결과를 보면 두번째 호출한 sort 함수의 결과만 적용된걸 알 수 있다.

그렇다면 operator 모듈의 itemgetter을 이용하면 어떨까?

# operator 모듈 import
import operator 

# sort 두번 호출
scores.sort(key=operator.itemgetter('score'))
scores.sort(key=operator.itemgetter('grade'))

# 정렬 요소를 tuple 로 전달
scores.sort(key=operator.itemgetter('grade', 'score'))

print(*scores, sep='\n')
{'no': 9, 'grade': 1, 'score': 24}
{'no': 1, 'grade': 1, 'score': 30}
{'no': 2, 'grade': 1, 'score': 42}
{'no': 5, 'grade': 2, 'score': 40}
{'no': 10, 'grade': 2, 'score': 55}
{'no': 3, 'grade': 2, 'score': 75}
{'no': 8, 'grade': 2, 'score': 100}
{'no': 4, 'grade': 3, 'score': 80}
{'no': 7, 'grade': 4, 'score': 94}
{'no': 6, 'grade': 5, 'score': 14}

itemgetter 를 이용하는 경우 sort 를 두번호출하여도 가능하고,
itemgetter로 정렬할 두 요소를 tuple 로 만들어서 key 로 전달해줘도 가능합니다.

다만 주의할점은 sort 를 두번 호출 할 경우 정렬 우선순위가 높을 수록 나중에 실행되어야 합니다.
( A, B 순으로 정렬해야하는경우 sort B => sort A 순으로 실행되어야 함. )

결과는 원하는 대로 grade 로 우선 정렬된 후 grade가 같은 경우 score 로 정렬된 결과를 얻은것을 확인하 실 수 있습니다.

감사합니다. 😄