관리 메뉴

솜씨좋은장씨

[Python] None이 포함된 리스트 정렬 시 발생하는 TypeError: '<' not supported between instances of 'str' and 'NoneType' 원인 및 해결 방법! ( feat. datetime ) 본문

Programming/Python

[Python] None이 포함된 리스트 정렬 시 발생하는 TypeError: '<' not supported between instances of 'str' and 'NoneType' 원인 및 해결 방법! ( feat. datetime )

솜씨좋은장씨 2022. 4. 21. 17:09
728x90
반응형

TypeError: '<' not supported between instances of 'str' and 'NoneType'

위의 에러는 제목에도 적은 것 처럼 sort 또는 sorted를 활용하여 리스트를 정렬하고자 할 때 만날 수 있는 에러입니다.

👨🏻‍💻 원인  - None이 포함된 리스트 정렬 시

해당 에러는 None이 포함되어있는 리스트를 sort나 sorted를 활용하여 정렬하고자 할 때 발생합니다.

example_list = [None, 1, 2, 3, 4, 5]

예를 들어 위와 같이 None이 포함된 리스트를

example_list = sorted(example_list)

example_list.sort()

위와 같이 아무런 설정 없이 정렬하고자 하면 

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-257-2c6981573861> in <module>
----> 1 example_list.sort()

TypeError: '<' not supported between instances of 'int' and 'NoneType'

위와 같이 에러가 발생하게 됩니다.

👨🏻‍💻 해결 방법! - key = lambda 옵션과 or 활용

리스트의 None을 다른 값으로 수정하지 않아도 아주 간단한 방법으로! 해결할 수 있는 방법이 있습니다.

바로 sort 와 sorted에 옵션으로 있는 key = lambda 옵션과 or 를 활용하면 됩니다.

example_list = sorted(example_list, key=lambda x: x or 10)

example_list.sort(key=lambda x: x or 10)

 

key = lambda를 활용하면 내가 정렬하는 때에 특정한 기준을 세워 정렬할 수 있도록 할 수 있습니다.

key=lambda x: x or 10

여기에 위처럼 x or 10 을 넣게 되면 x가 None일 경우 x를 10으로 보고 정렬하도록 설정 됩니다.

x or 10

이게 어떻게 그렇게 되는거지? 싶다면

None or 10
> 10

None or 10 의 값이 10으로 나오는 것을 확인해보시면 이해가 될겁니다.

위와 같이 옵션을 주고 다시 정렬해보면!

example_list = [None, 1, 2, 3, 4, 5]

example_list = sorted(example_list, key=lambda x: x or 10)
> [1, 2, 3, 4, 5, None]
example_list.sort(key=lambda x: x or 10)
> [1, 2, 3, 4, 5, None]

sorted와 sort 모두 None을 10으로 인식하고 오류 없이 맨 뒤로 정렬된 것을 볼 수 있습니다.

👨🏻‍💻 None이 여러 위치에 존재하면 어떻게 하지?

example_list = [[None, 1], [1, 2], [2, 2], [3, 3], [4, 4], [5, None]]

위처럼 None이 여러 위치에 존재하는 경우에는

당황하지 말고!

example_list = sorted(example_list, key=lambda x: (x[0] or -1, x[1] or 19))

example_list.sort(key=lambda x: (x[0] or -1, x[1] or 19))

위와 같이 조건을 (조건 1, 조건2) 튜플 형태로 만들어 주면 됩니다.

여기서는 각 값의 첫번째 위치에 나오는 None은 -1로 뒤에 나오는 None은 19로 인식하도록 하였습니다.

> [[None, 1], [1, 2], [2, 2], [3, 3], [4, 4], [5, None]]

결과는 위와 같습니다.

👨🏻‍💻 내가 정렬하려는 리스트에 datetime 형식과 None이 섞여있어요!

이 경우가 이번에 API를 개발하면서 존재했던 경우인데

이 경우에는 datetime의 min과 max를 활용해주면 됩니다.

from datetime import datetime

datetime.max
> datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)

datetime.min
> datetime.datetime(1, 1, 1, 0, 0)

각각

datetime.max의 값은 9999년 12월 31일 23시 59분 59초 999999

datetime.min의 값은 1년 1월 1일 0시 0분 

의 값을 가지고 있습니다.

from datetime import datetime

# datetime.max
example_list = sorted(example_list, key=lambda x: x or datetime.max)

example_list.sort(key=lambda x: x or datetime.max)

# datetime.min
example_list = sorted(example_list, key=lambda x: x or datetime.min)

example_list.sort(key=lambda x: x or datetime.min)

각 상황에 따라 필요한 값을 활용하면 됩니다.

 

읽어주셔서 감사합니다.

Comments