바쁜 분은 이것만
- 원본을 바꿔도 됨:
nums.sort()— 반환값은 None이니 변수에 넣지 말 것 - 원본은 그대로, 새 리스트:
new = sorted(nums) - 기준 바꾸기:
sorted(data, key=lambda x: x[1], reverse=True)
파이썬에서 정렬하는 방법은 sort()와 sorted() 두 가지입니다. 이름이 비슷해서 섞어 쓰다 보면 갑자기 리스트가 None이 되는 일이 생겨요. 아래는 Python 3.14.3에서 실제로 실행한 결과입니다.
1. 정렬했더니 None이 나온다
nums = [3, 1, 2]
r = nums.sort()
print("nums.sort()의 반환값:", r)
print("nums:", nums)
nums.sort()의 반환값: None
nums: [1, 2, 3]
sort()는 리스트 자체를 바꾸고 아무것도 돌려주지 않습니다(None). 그래서 이렇게 쓰면 리스트를 잃어버려요.
nums = [3, 1, 2]
nums = nums.sort()
print(nums)
None
정렬 결과를 변수에 받고 싶다면 sorted()를 씁니다.
nums = [3, 1, 2]
new = sorted(nums)
print(new, nums)
[1, 2, 3] [3, 1, 2]
sorted()는 정렬된 새 리스트를 돌려주고 원본은 그대로 둡니다.
2. sorted()는 리스트가 아니어도 된다
sorted("banana") # ['a', 'a', 'a', 'b', 'n', 'n']
sorted((3, 1, 2)) # [1, 2, 3]
sorted({"b": 2, "a": 1}) # ['a', 'b'] ← 딕셔너리는 키만
(3, 1, 2).sort()
AttributeError: 'tuple' object has no attribute 'sort'
sort()는 리스트에만 있는 메서드라 튜플에는 없어요. sorted()는 문자열·튜플·딕셔너리처럼 하나씩 꺼낼 수 있는 건 다 받고, 결과는 항상 리스트입니다.
3. key로 기준 바꾸기
기본 정렬은 대문자가 소문자보다 앞에 옵니다(문자 코드 순).
words = ["banana", "apple", "Cherry", "date"]
sorted(words) # ['Cherry', 'apple', 'banana', 'date']
sorted(words, key=str.lower) # ['apple', 'banana', 'Cherry', 'date']
sorted(words, key=len) # ['date', 'apple', 'banana', 'Cherry']
key에는 "각 항목을 무엇으로 바꿔서 비교할지"를 알려 주는 함수를 넣습니다. str.lower는 소문자로 바꿔서, len은 길이로 비교해요. 내림차순은 reverse=True.
4. 파일명 숫자 순서대로 (img2가 img10보다 앞에)
files = ["img10.jpg", "img2.jpg", "img1.jpg"]
sorted(files)
['img1.jpg', 'img10.jpg', 'img2.jpg']
문자열은 앞 글자부터 비교하니 "1" 다음 "10"이 옵니다. 숫자만 뽑아서 기준으로 쓰면 됩니다.
import re
sorted(files, key=lambda f: int(re.search(r"\d+", f).group()))
['img1.jpg', 'img2.jpg', 'img10.jpg']
5. 점수 높은 순, 같으면 이름순
students = [("영희", 90), ("철수", 85), ("민지", 90), ("하늘", 70)]
sorted(students, key=lambda s: s[1], reverse=True)
[('영희', 90), ('민지', 90), ('철수', 85), ('하늘', 70)]
점수가 같은 영희와 민지는 원래 순서 그대로 남았습니다(파이썬 정렬은 같은 값의 순서를 유지해요). 같은 점수일 때 이름순으로 하고 싶다면 key에 튜플을 넣습니다.
sorted(students, key=lambda s: (-s[1], s[0]))
[('민지', 90), ('영희', 90), ('철수', 85), ('하늘', 70)]
-s[1]로 점수는 높은 순, s[0]으로 이름은 가나다순. 숫자에 마이너스를 붙이는 게 "이 기준만 거꾸로" 하는 간단한 방법입니다.
6. 딕셔너리를 값 기준으로 정렬
scores = {"철수": 85, "민지": 90, "하늘": 70}
sorted(scores.items(), key=lambda kv: kv[1], reverse=True)
dict(sorted(scores.items(), key=lambda kv: kv[1], reverse=True))
[('민지', 90), ('철수', 85), ('하늘', 70)]
{'민지': 90, '철수': 85, '하늘': 70}
items()로 (키, 값) 쌍을 꺼내 정렬하고, 필요하면 dict()로 다시 감싸요. 파이썬 3.7부터 딕셔너리는 넣은 순서를 기억하기 때문에 정렬된 순서가 유지됩니다.
7. 이런 에러가 나면
sorted([3, "a", 1])
sorted([2, None, 1])
TypeError: '<' not supported between instances of 'str' and 'int'
TypeError: '<' not supported between instances of 'NoneType' and 'int'
파이썬 3는 숫자와 문자, 숫자와 None을 크기 비교하지 않습니다. 엑셀·CSV에서 읽은 데이터에 빈칸(None)이 섞였을 때 자주 나와요. None을 맨 뒤로 보내려면:
sorted([2, None, 1], key=lambda x: (x is None, x if x is not None else 0))
[1, 2, None]
튜플의 첫 값 x is None이 False(0)인 숫자가 앞, True(1)인 None이 뒤로 갑니다.
정리
| list.sort() | sorted() | |
|---|---|---|
| 원본 | 바뀜 | 그대로 |
| 반환값 | None | 새 리스트 |
| 대상 | 리스트만 | 문자열·튜플·딕셔너리 등 전부 |
| key / reverse | 사용 가능 | 사용 가능 |
참고: Python 공식 문서 Sorting Techniques(docs.python.org/3/howto/sorting.html), Built-in Functions — sorted()
'프로그래밍 공부 > pyhton' 카테고리의 다른 글
| 2026년 맥북 파이썬 설치 방법|Homebrew로 3.14 설치하고 venv까지 (externally-managed 에러 해결) (0) | 2026.10.08 |
|---|---|
| 맥북에서 주피터 랩 GUI 버전을 설치해보자 - Install the JupyterLab GUI App (jupyterlab-desktop) on macOS (0) | 2025.04.08 |
| 맥북에서 파이썬 & 주피터 노트북 설치하기 - Installing Python and Jupyter Notebook on macOS (2) | 2025.04.08 |
| 파이썬 데이터 분석 - Seaborn을 활용한 고급 데이터 시각화 (0) | 2025.03.18 |
| 파이썬 데이터 분석 - Pandas를 활용한 데이터 시각화 (0) | 2025.03.14 |
