여기서는 오름차순이나 내림차순보다 원본을 바꿀지, 비교 기준을 무엇으로 뽑을지를 먼저 봅니다.
정렬 코드는 sorted()와 sort()의 차이보다도 key=가 무엇인지가 더 중요할 때가 많습니다.
숏컷 코드
names = ["mina", "Jin", "sora"]
ordered = sorted(names, key=str.lower)
users = [
{"name": "Mina", "age": 26},
{"name": "Jin", "age": 21},
]
users.sort(key=lambda user: user["age"])문법
기본형은 새 결과 정렬, 원본 정렬, key, 다중 기준, 역순까지 같이 보면 됩니다.
ordered = sorted(items)
ordered = sorted(items, key=key_func, reverse=True)
items.sort()
items.sort(key=key_func)
items.sort(key=lambda x: (a(x), b(x)))정렬 코드를 읽을 때는 sorted(...)나 .sort(...)를 본 뒤, 바로 key=가 무엇을 뽑는지로 넘어가는 편이 빠릅니다.
결과 선택
새 결과가 필요하면 sorted(), 원본을 바꾸면 list.sort()다
sorted()는 iterable을 받아 정렬된 새 리스트를 반환합니다.
원본을 그대로 두고 결과만 따로 쓰고 싶을 때 맞습니다.
nums = [3, 1, 2]
a = sorted(nums)
print(nums) # [3, 1, 2]
print(a) # [1, 2, 3]원본 보존이 중요하면 sorted()부터 떠올리면 됩니다.
nums = [3, 1, 2]
nums.sort()
print(nums) # [1, 2, 3]즉 "새 결과냐 / 원본 변경이냐"가 sorted와 sort를 가르는 첫 번째 질문입니다.
기준 추출
정렬 코드는 key=를 먼저 읽는다
Python 정렬의 핵심은 알고리즘보다 key입니다.
원소 자체를 비교하기보다, 각 원소에서 무엇을 비교 기준으로 뽑는가가 더 중요합니다.
words = ["banana", "fig", "apple"]
ordered = sorted(words, key=len)그래서 정렬 코드를 읽을 때는 sorted(...)보다 key= 쪽을 먼저 보는 편이 맞습니다.
다중 기준
여러 기준이면 tuple key가 가장 직접적이다
여러 기준으로 정렬할 때는 key 함수가 tuple을 반환하게 만들면 됩니다.
Python은 tuple을 앞에서부터 차례로 비교합니다.
users = [
{"name": "Mina", "age": 26},
{"name": "Jin", "age": 26},
{"name": "Sora", "age": 21},
]
ordered = sorted(users, key=lambda user: (user["age"], user["name"]))복잡한 비교 함수를 직접 짜기보다 tuple key가 훨씬 읽기 쉽고 Python스럽습니다.
자주 보는 형태
흔한 key 패턴은 바로 떠올릴 수 있어야 한다
ordered = sorted(words, key=len)
ordered = sorted(names, key=str.lower)
ordered = sorted(users, key=lambda user: user["age"], reverse=True)길이, 대소문자 무시, 특정 필드, 역순 정렬은 실전에서 가장 자주 다시 보는 패턴입니다.
주의할 점
비교 기준이 없는데 서로 다른 타입을 섞어 정렬하면 오류가 날 수 있습니다. Python 3에서는 임의 비교를 자동으로 해 주지 않습니다.
# ❌ int와 str를 직접 비교할 수 없음
values = [1, "2", 3]
# sorted(values)
# ✅ 비교 가능한 공통 값으로 변환
values = [1, "2", 3]
ordered = sorted(values, key=str)참고 링크
2 sources