아침에 출근하려고 지하철을 탔는데, 사람들이 너무 많아서 발 디딜 틈조차 없었던 적, 다들 한 번쯤은 있으시죠?
이처럼 복잡한 세상, 데이터도 마찬가지입니다.
때로는 우리가 원하는 방식으로 데이터를 정렬해야 할 때가 생기죠.
파이썬에서는 `sort()`와 `sorted()`라는 강력한 도구를 통해 리스트를 정렬할 수 있는데, 단순한 오름차순, 내림차순 정렬뿐만 아니라, 훨씬 더 복잡하고 다양한 기준으로 데이터를 정렬할 수 있다는 사실, 알고 계셨나요?
이번 글에서는 파이썬에서 정렬을 커스터마이징하는 방법에 대해 자세히 알아보겠습니다.
파이썬 기본 정렬: `sort()` vs `sorted()`
파이썬에서 리스트를 정렬하는 기본적인 방법은 `sort()` 함수와 `sorted()` 함수를 사용하는 것입니다.
두 함수 모두 리스트를 정렬해 주지만, 중요한 차이점이 있습니다.
`sort()`는 리스트의 메서드로서, 리스트 자체를 정렬하고 결과를 반환하지 않습니다(None을 반환).
즉, 원래 리스트의 순서가 변경됩니다.
반면 `sorted()`는 내장 함수로서, 정렬된 새로운 리스트를 반환하고 원래 리스트는 변경하지 않습니다.
어떤 함수를 사용할지는 상황에 따라 선택하면 됩니다.
만약 원래 리스트를 보존해야 한다면 `sorted()`를, 메모리 효율성을 중요시하거나 원래 리스트를 변경해도 상관없다면 `sort()`를 사용하는 것이 좋습니다.
오름차순, 내림차순 정렬
기본적으로 `sort()`와 `sorted()`는 오름차순으로 정렬합니다.
내림차순으로 정렬하고 싶다면 `reverse` 매개변수를 `True`로 설정하면 됩니다.
```python
my_list = [3, 1, 4, 1, 5, 9, 2, 6]
my_list.sort(reverse=True)
print(my_list) # 출력: [9, 6, 5, 4, 3, 2, 1, 1]
new_list = sorted(my_list, reverse=True)
print(new_list) # 출력: [9, 6, 5, 4, 3, 2, 1, 1]
```
람다(lambda)식을 이용한 정렬
파이썬의 람다식은 익명 함수를 만드는 데 사용되며, 정렬 기준을 간단하게 정의하는 데 유용합니다.
예를 들어, 문자열 리스트를 문자열 길이를 기준으로 정렬하고 싶다면 다음과 같이 할 수 있습니다.
```python
words = ['apple', 'banana', 'kiwi', 'orange']
words.sort(key=lambda x: len(x))
print(words) # 출력: ['kiwi', 'apple', 'banana', 'orange']
```
여기서 `key` 매개변수는 정렬에 사용할 함수를 지정합니다.
람다식 `lambda x: len(x)`는 각 문자열 `x`에 대해 길이를 반환하고, `sort()` 함수는 이 길이를 기준으로 문자열을 정렬합니다.
요즘 코딩 테스트에서도 람다식을 활용한 정렬 문제가 자주 출제되는 추세입니다.
`functools.cmp_to_key()`를 이용한 정렬
과거 파이썬 2에서는 `cmp` 매개변수를 사용하여 정렬 기준을 정의할 수 있었습니다.
하지만 최신 파이썬 버전에서는 `cmp` 매개변수가 사라지고 `functools.cmp_to_key()` 함수를 사용하여 `cmp` 스타일의 비교 함수를 `key` 함수로 변환할 수 있습니다.
```python
from functools import cmp_to_key
def compare(x, y):
if x < y:
return -1
elif x > y:
return 1
else:
return 0
my_list = [3, 1, 4, 1, 5, 9, 2, 6]
my_list.sort(key=cmp_to_key(compare))
print(my_list) # 출력: [1, 1, 2, 3, 4, 5, 6, 9]
```
`compare` 함수는 두 개의 인자를 받아 비교 결과를 반환합니다.
`x < y`이면 -1, `x > y`이면 1, 같으면 0을 반환합니다.
`cmp_to_key()` 함수는 이 비교 함수를 `key` 함수로 변환하여 `sort()` 함수에 전달합니다.
객체(Object) 정렬
리스트에 객체가 담겨 있을 때는 객체의 특정 속성을 기준으로 정렬해야 할 경우가 많습니다.
이때도 `key` 매개변수를 사용하여 정렬 기준을 정의할 수 있습니다.
```python
class Student:
def __init__(self, name, grade):
self.name = name
self.grade = grade
def __repr__(self):
return f"Student(name='{self.name}', grade={self.grade})"
students = [
Student("Alice", 90),
Student("Bob", 80),
Student("Charlie", 95),
]
students.sort(key=lambda student: student.grade)
print(students)
# 출력: [Student(name='Bob', grade=80), Student(name='Alice', grade=90), Student(name='Charlie', grade=95)]
```
위 예제에서는 `Student` 클래스의 `grade` 속성을 기준으로 학생 객체를 정렬했습니다.
`lambda student: student.grade`는 각 학생 객체에 대해 `grade` 속성 값을 반환하고, `sort()` 함수는 이 값을 기준으로 학생 객체를 정렬합니다.
파이썬의 정렬 기능은 단순한 숫자 정렬부터 복잡한 객체 정렬까지, 다양한 요구사항을 충족할 수 있도록 설계되었습니다.
`sort()`와 `sorted()` 함수의 차이점을 이해하고, 람다식, `functools.cmp_to_key()`, `key` 매개변수를 활용하면 데이터를 원하는 대로 정렬할 수 있습니다.
데이터 분석, 인공지능 모델링 등 다양한 분야에서 정렬은 필수적인 기술이므로, 파이썬 정렬 기능을 익혀두면 개발 생산성을 크게 향상시킬 수 있을 것입니다.
'개발' 카테고리의 다른 글
| 파이썬에서 참조(reference)가 헷갈리는 이유 (0) | 2026.02.03 |
|---|---|
| 파이썬에서 얕은 복사 vs 깊은 복사, 실수하기 쉬운 포인트 (0) | 2026.02.03 |
| map, filter, reduce 제대로 쓰는 법 (0) | 2026.01.31 |
| lambda 함수, 쓰지 말라는 사람도 많은 이유 (0) | 2026.01.31 |
| 이터레이터(iterator)와 iterable 완전 정리 (0) | 2026.01.31 |