본문 바로가기
개발

파이썬에서 정렬(sort) 커스터마이징하기

by Kyutree 2026. 1. 31.

아침에 출근하려고 지하철을 탔는데, 사람들이 너무 많아서 발 디딜 틈조차 없었던 적, 다들 한 번쯤은 있으시죠?

이처럼 복잡한 세상, 데이터도 마찬가지입니다.

때로는 우리가 원하는 방식으로 데이터를 정렬해야 할 때가 생기죠.

파이썬에서는 `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` 매개변수를 활용하면 데이터를 원하는 대로 정렬할 수 있습니다.

데이터 분석, 인공지능 모델링 등 다양한 분야에서 정렬은 필수적인 기술이므로, 파이썬 정렬 기능을 익혀두면 개발 생산성을 크게 향상시킬 수 있을 것입니다.