알고리즘

파이썬 딕셔너리 lambda TypeError: bad operand type for unary -: 'str' 에러 관련

초코비23 2022. 10. 25. 21:35

파이썬 딕셔너리(Dictionary)를 정렬할 때 보통 문자열에 정렬을 시도하는 경우가 있습니다.

 

오름차순은 

 

위 사진과 같이 정상 작동하나

 

내림차순으로 정렬을 시도 시( -x[0])

위 사진과 같이 TypeError: bad operand type for unary -: 'str' 에러가 발생합니다.

이 오류는 문자열로 된 값에 마이너스부호를 붙일 수 없다는 데에서 오는 오류이다.

 

물론 reverse=True 를 사용하여 반대로 정렬할 수 있습니다.

 

하지만, 이렇게 하나의 정렬 조건만 쓰는 경우가 아닌 

 

x : (x[0], -x[1]) 와 같이 여러 정렬 조건을 쓰게 된다면 조건이 엉킬 수 있습니다.

 

-----------------------

파이썬에서는 이런 상황을 위해 안정적인(stable) 정렬 알고리즘을 제공합니다.

리스트 타입의 sort 메서드는 key 함수가 반환하는 값이 서로 같은 경우 리스트에 들어 있던 원래 순서를 그대로 유지해줍니다.

이는 같은 리스트에 대해 서로 다른 기준으로 sort를 여러 번 호출해도 된다는 뜻입니다.

 

결론 : sort를 두 번 호출하는 방식으로 정렬을 수행이 좋습니다.

ex)

dic = sorted(dic, key= lambda x: x[0])
dic = sorted(dic, key= lambda x: x[0], reverse=True)