일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 맥북
- 백준
- ChatGPT
- 캐치카페
- dacon
- Git
- PYTHON
- 금융문자분석경진대회
- 우분투
- github
- AI 경진대회
- ubuntu
- gs25
- 프로그래머스 파이썬
- Real or Not? NLP with Disaster Tweets
- 편스토랑
- Kaggle
- SW Expert Academy
- programmers
- 자연어처리
- 편스토랑 우승상품
- leetcode
- 프로그래머스
- Baekjoon
- 코로나19
- 더현대서울 맛집
- hackerrank
- 파이썬
- 데이콘
- Docker
- Today
- Total
솜씨좋은장씨
[Python] None이 포함된 리스트 정렬 시 발생하는 TypeError: '<' not supported between instances of 'str' and 'NoneType' 원인 및 해결 방법! ( feat. datetime ) 본문
[Python] None이 포함된 리스트 정렬 시 발생하는 TypeError: '<' not supported between instances of 'str' and 'NoneType' 원인 및 해결 방법! ( feat. datetime )
솜씨좋은장씨 2022. 4. 21. 17:09
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)
각 상황에 따라 필요한 값을 활용하면 됩니다.
읽어주셔서 감사합니다.
'Programming > Python' 카테고리의 다른 글
[Python] Inconsistent use of tabs and spaces in indentation 해결 방법 (0) | 2022.04.29 |
---|---|
[Python] Jupyter Notebook 비밀번호 변경하는 방법! (0) | 2022.04.28 |
[Python] Ubuntu에서 ODBC를 활용하여 Python으로 Tibero6를 연결하는 방법! (1) | 2022.04.10 |
[Python] PyMuPDF를 활용하여 PDF를 image로 변환하는 방법! (0) | 2022.04.09 |
[Python] pyodbc를 활용하여 Tibero 연결 시 발생하는 TBR-15146: PSM compilation error 해결 방법 (0) | 2022.03.27 |