내가 정한 기준대로 정렬하는 법
데이터를 다루다 보면 꼭 마주치는 고민이 있다.
“어떤 기준으로 정렬하지?”
숫자를 크기순으로, 이름을 가나다순으로,
날짜는 오래된 순서로 정리해야 할 때,
파이썬에서는 sorted()
함수 하나면 충분하다.
하지만 처음엔 sort()
와 헷갈리고,
key
, lambda
, reverse
같은 옵션이 낯설게 느껴졌다.
그래서 sorted()
의 기본 개념부터
자료형별 사용법, 실전 예시, 그리고 자주 하는 실수까지
한 번에 정리했다.
1. sorted()와 sort()의 차이
항목 | sorted() |
.sort() |
---|---|---|
사용 대상 | 모든 iterable (리스트, 튜플 등) | 리스트만 사용 가능 |
반환값 | 새로운 리스트 반환 | 리스트 자체를 정렬 (None 반환) |
원본 변경 | 하지 않음 | 변경함 |
사용 예시 | sorted([3, 1, 2]) |
a = [3, 1, 2]; a.sort() |
2. sorted()를 쓸 수 있는 자료형은?
•리스트 (list
)
•튜플 (tuple
)
•문자열 (str
) ➡️ 정렬된 문자 리스트가 반환됨
•딕셔너리 (dict
) ➡️ key 기준 정렬
sorted('hello') # ['e', 'h', 'l', 'l', 'o']
sorted((3, 2, 1)) # [1, 2, 3]
sorted({'c': 3, 'a': 1}) # ['a', 'c']
3. sorted() 정렬 key 접근 방식 요약표
자료형 | 예시 | key=lambda 식 | 설명 |
---|---|---|---|
리스트(숫자) | [50, 30, 70] |
key=lambda x: x |
값 자체로 정렬 |
딕셔너리 | {"name": "지희", "score": 85} |
key=lambda x: x['score'] |
딕셔너리의 키로 접근 |
튜플 | ("지희", 85) |
key=lambda x: x[1] |
인덱스로 접근 (0, 1, 2…) |
객체 | Student("지희", 85) |
key=lambda x: x.score |
속성명으로 접근 (.속성 ) |
4. 자료형 예시
1) 리스트 (숫자만 있을 때)
nums = [50, 30, 70]
sorted_nums = sorted(nums, key=lambda x: x)
2) 딕셔너리
people = [{"name": "지희", "score": 85}, {"name": "정우", "score": 90}]
sorted_people = sorted(people, key=lambda x: x['score'], reverse=True)
3) 튜플
scores = [("지희", 85), ("정우", 90)]
sorted_scores = sorted(scores, key=lambda x: x[1], reverse=True)
4) 클래스 객체
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
students = [Student("지희", 85), Student("정우", 90)]
sorted_students = sorted(students, key=lambda x: x.score, reverse=True)
5) 핵심 공식 요약
• []
는 딕셔너리 / 튜플
에
• .
은 클래스 객체
에
• 아무것도 안 쓰면 숫자/문자 리스트 자체
이 3가지만 기억하면 정렬은 어디든 적용 할 수 있다!
5. sorted()를 쓸 수 있는 조건과 규칙
핵심 조건: 정렬의 기준이 명확한 “값”이 존재할 때
- 숫자 (
총점
,나이
,점수
,길이
등) - 문자열 (
이름
,알파벳순
,파일명
등) - 날짜 (
가입일
,생일
,업데이트 시각
등)
6. sorted 공식
sorted(데이터, key=lambda x: x.비교할속성, reverse=True/False)
목표 | sorted 공식 |
---|---|
점수 높은 순 정렬 | sorted(data, key=lambda x: x.score, reverse=True) |
이름 오름차순 정렬 | sorted(data, key=lambda x: x.name) |
길이 짧은 것부터 정렬 | sorted(data, key=lambda x: len(x)) |
날짜 오래된 순 정렬 | sorted(data, key=lambda x: x.date) |
7. for문 → sorted 변환
• 상황: 데이터를 기준값에 따라 정렬해서 그 순서대로 무언가를 하고 싶을 때
1) for 문
# 원래 비교 기반 방식
for a in data:
rank = 1
for b in data:
if b.📌속성 > a.📌속성:
rank += 1
a.순위 = rank
2) sorted 문
# 정렬 기반 방식
sorted_data = sorted(data, key=lambda x: x.📌속성, reverse=True)
for rank, item in enumerate(sorted_data, start=1):
item.순위 = rank
여기서 핵심은 “비교 기준이 되는 속성” 이 뭐지?
그걸 key=lambda x: x.속성에 넣어주면 🆗
3) 기본 구조 비교
일반 for문 구조 | sorted 적용 구조 |
---|---|
for item in data: |
sorted_data = sorted(data, key=___, reverse=___) |
# 기준 비교: item.속성 비교 |
for rank, item in enumerate(sorted_data, start=1): |
item.순위 = rank |
item.순위 = rank |
“정렬된 순서 = 순위다!” 단, 비교 기준만 정확히 알면
sorted() + enumerate()로 깔끔하게 바꿀 수 있다.
오늘을 마치며
정렬은 단순한 기술이 아니라
데이터의 우선순위를 판단하는 일이다.
sorted()
는 그 판단을 코드로 표현하는 도구다.
숫자, 문자열, 날짜, 클래스 객체까지
내가 원하는 기준을 명확히 정할 수 있다면
정렬은 언제나 가장 강력한 도우미가 되어줄 것이다.
정렬 기준을 안다는 건 데이터를 읽는 눈을 갖는다는 뜻 👀
그 눈을 갖추는 첫걸음, 바로 sorted()
에서 시작된다.