더북(TheBook)

아쉽지만 모든 타입에 부호 반전을 사용할 수는 없다. 다음 코드는 sortreverse 인자를 지정하고, weight 기준 오름차순으로 정렬하고, name을 반전시켜서 앞에서 본 예제와 같은 결과를 만들려고 시도하지만 실패한다.

power_tools.sort(key=lambda x: (x.weight, -x.name),
                 reverse=True)

>>>
Traceback ...
TypeError: bad operand type for unary -: 'str'

파이썬에서는 이런 상황을 위해 안정적인(stable) 정렬 알고리즘을 제공한다. 리스트 타입의 sort 메서드는 key 함수가 반환하는 값이 서로 같은 경우 리스트에 들어 있던 원래 순서를 그대로 유지해준다. 이는 같은 리스트에 대해 서로 다른 기준으로 sort를 여러 번 호출해도 된다는 뜻이다. 다음 코드는 앞에서 보여준 코드와 마찬가지로 weight 기준 내림차순, name 기준 오름차순으로 정렬하는데, sort를 두 번 호출하는 방식으로 정렬을 수행한다.

power_tools.sort(key=lambda x: x.name)    # name 기준 오름차순

power_tools.sort(key=lambda x: x.weight,  # weight 기준 내림차순
                 reverse=True)
print(power_tools)

>>>
[Tool('착암기', 40), Tool('원형 톱', 5), Tool('드릴', 4), Tool('연마기', 4)]
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.