파이썬
컨테이너 타입
리스트
정렬

파이썬 리스트 정렬: 설명과 예제

데이터 정렬은 프로그래밍의 기초가 되는 알고리즘이자, 실제 개발에서 가장 자주 수행하는 작업 중 하나입니다. 이렇게 중요한 만큼 파이썬은 다양한 함수 혹은 메서드로 여러 정렬 방법을 제공하는데요. 파이썬 내장 함수들은 대부분의 경우에, 개발자가 직접 작성한 코드보다 신뢰할 수 있고 빠르기 때문에 최대한 활용하는 것이 좋습니다.

그래서 이번 시간에는, 파이썬이 제공하는 리스트 정렬 방법에 대해서 낱낱이 알아보고자 합니다. 기본적인 sorted() 함수나 sort() 메서드를 기반으로 해서, 여러 가지 상황에 대해 정리해봅니다.

1. 정렬한 새 리스트를 반환하는 sorted() 함수

sorted() 함수는 인자로 주어진 리스트를 오름차순으로 정렬한 새 리스트를 반환하는 내장 함수입니다. 원래의 리스트는 변하지 않습니다.

sorted() 함수를 사용하려면, 아래와 같이 정렬하고자 하는 리스트를 파라미터로 전달합니다.

unsorted_list = [5, 2, 8, 1, 3]
sorted_list = sorted(unsorted_list)
 
print(sorted_list)  # Output: [1, 2, 3, 5, 8]

2. reverse 파라미터로 내림차순 정렬

sorted() 함수는 2가지 파라미터 key, reverse 를 갖습니다.

이 중, reverse 파라미터는 내림차순 정렬을 원하는지 여부를 전달받으며, True 값을 전달하면 내림차순으로 정렬합니다. 섹션 1에서 보았듯이, sorted() 함수가 기본적으로 오름차순 정렬을 하는 이유는, 이 파라미터의 기본값이 False이기 때문입니다.

unsorted_list = [5, 2, 8, 1, 3]
sorted_list = sorted(unsorted_list, reverse=True)
 
print(sorted_list)  # Output: [8, 5, 3, 2, 1]

3. key 파라미터를 이용해 원하는 조건 정렬

sorted() 함수로 오름차순, 내림차순 이외의 나만의 기준으로 정렬하고자 할 때는 key 파라미터를 이용합니다. 우리는 key 파라미터에 내장 함수 혹은 사용자 정의 함수를 전달해서 새로운 정렬 기준을 적용합니다.

우선, 내장 함수를 전달해서 정렬하는 예제부터 보겠습니다.

파이썬 내장 함수 len 을 key 함수로 전달해서 그 리턴값인 문자열 길이를 기준으로 정릴합니니다. 따로, reverse 파라미터 값을 전달하지 않았으니, 오름차순으로 정렬됩니다.

words = ['apple', 'banana', 'cherry', 'date', 'fig']
sorted_words = sorted(words, key=len)
 
print(sorted_words)  # Output: ['fig', 'date', 'apple', 'banana', 'cherry']

다음은 lambda 함수로 정의한 사용자 정의 함수를 전달해서 정렬한 예제입니다.

이름과 나이 값을 가진 여러 개의 딕셔너리를 나이 값을 기준으로 정릴하기 위해, 람다 함수에서, 리스트의 각 멤버를 user로 받고 age 키에 해당하는 값을 가져와 정렬 기준으로 삼았습니다.

users = [
    {
        'name': 'Alice',
        'age': 30
    },
    {
        'name': 'Bob',
        'age': 25
    },
    {
        'name': 'Charlie',
        'age': 35
    },
    {'
        name': 'David',
        'age': 28
    }
]
 
sorted_users = sorted(users, key=lambda user: user['age'])
 
print(sorted_users)

4. 여러개 기준으로 정렬

여러 개의 기준으로 정렬하기 위해서는, key 함수에서 원하는 기준값으로 이루어진 튜플을 리턴하면 됩니다.

아래 예제는 영화 데이터를 평점, 개봉 연도 순으로 정렬하는 예제입니다. 같은 평점을 가진 '메멘토'와 '프레스티지'는 다시 개봉 연도 순으로 정렬되었습니다.

movies = [
    {
        'title': 'Inception',
        'year': 2010,
        'rating': 8.8
    },
    {
        'title': 'Interstellar',
        'year': 2014,
        'rating': 8.6
    },
    {
        'title': 'The Prestige',
        'year': 2006,
        'rating': 8.5
    },
    {
        'title': 'Memento',
        'year': 2000,
        'rating': 8.5
    }
]
sorted_movies = sorted(movies, key=lambda movie: (movie['rating'], movie['year']))
print(sorted_movies)

5. None 값을 리턴하는 list.sort() 메서드

list.sort() 메서드는 파이썬 리스트 클래스가 가진 기본 내장 메서드입니다. 앞서 보았던 sorted() 함수와 다르게, 이 메서드는 리스트 자체를 정렬된 상태로 변경하고, None을 반환합니다.

sort()[:py}] 메서드는 아래 코드와 같이, 정렬하고 싶은 리스트에 실행하면 됩니다.

unsorted_list = [5, 2, 8, 1, 3]
unsorted_list.sort()
 
print(unsorted_list)  # Output: [1, 2, 3, 5, 8]

sort() 메서드도 keyreverse, 이렇게 2가지 파라미터를 가집니다. 두 파라미터의 용도도 seorted() 함수와 동일합니다.

unsorted_list = [5, 2, 8, 1, 3]
unsorted_list.sort(reverse=True)
 
print(unsorted_list)  # Output: [8, 5, 3, 2, 1]
 
names = ['Alice', 'Bob', 'Charlie', 'David']
names.sort(key=len)
 
print(names)  # Output: ['Bob', 'Alice', 'David', 'Charlie']

6. list.sort() 메서드 vs. sorted() 함수

파이썬에서 정렬에 사용하는 2가지 방법의 가장 큰 차이점은 원래의 리스트를 조작하는지 여부입니다.

list.sort() 메서드는 원래의 리스트를 정렬합니다. 그래서 원래의 리스트가 보존되지 않습니다. sotted() 함수는 원래의 리스트를 보존하고, 정렬한 새 리스트를 반환합니다.

list.sort() 메서드가 메모리를 덜 사용하는 이점이 있다면, sorted() 함수는 기존 리스트를 보존하고, 여러 함수형 프로그래밍 함수들과 함께 사용할 수 있다는 이점이 있습니다.

original_list = [5, 2, 8, 1, 3]
sorted_list = sorted(original_list)
 
print(original_list)  # Output: [5, 2, 8, 1, 3]
print(sorted_list)  # Output: [1, 2, 3, 5, 8]
 
original_list.sort()
 
print(original_list) # Output: [1, 2, 3, 5, 8]

7. 파이썬 정렬 알고리즘: TimSort

모던 파이썬에서 리스트를 정렬할 때 사용되는 기본 정렬 알고리즘은 TimSort 입니다.. 이 알고리즘은 Tim Peters가 설계했으며, 2002년에 파이썬에 처음 도입되었습니다. 이후로 Java 및 Android, Swift 등 다른 여러 프로그래밍 언어 및 시스템에서도 사용되었습니다.

TimSort는 병합 정렬 (Merge Sort)과 삽입 정렬(Insertion Sort)을 결합한 정렬 알고리즘입니다. 데이터의 일부분에 대해 삽입 정렬을 수행한 후, 이를 병합 정렬 방식으로 합치는 방식으로 작동합니다. 이런 방식은 데이터의 특정 부분이 이미 정렬되어 있는 경우, 매우 빠른 속도를 내는 장점이 있습니다.

TimSort의 시간 복잡도는 최악의 경우 O(n log n)이며, 이미 정렬된 리스트에 대해서는 선형 시간 복잡도인 O(n)을 가집니다.

마치며

이번 시간에는, 파이썬에서 리스트를 정렬하는 기본적인 방법부터 key 함수 활용, 알고리즘에 대해서까지 알아보았습니다. 오늘 살펴본 내용이 실제 개발 과정에서 큰 도움이 되길 바랍니다.

copyright for 파이썬 리스트 정렬: 설명과 예제

© 2023 All rights reserved.