Python에서 정렬된 함수 이해하기: 간단한 안내서
파이썬에서 코딩할 때 가장 큰 매력 중 하나는 그 간결함입니다. 파이썬 표준 라이브러리는 매우 풍부한 기능들을 제공하여 개발자들이 쉽게 작업할 수 있도록 돕습니다. 그 중에서도 '정렬(sorted)' 함수는 특히 유용합니다.
이 함수는 순서가 없는 반복 가능한 객체(iterable)를 정렬된 상태로 만들어줍니다. 이 함수가 없다면, 개발자는 버블 정렬이나 삽입 정렬 같은 알고리즘을 직접 구현해야 합니다. 이는 종종 복잡하고 시간이 많이 걸리는 작업이 될 수 있습니다. 하지만 파이썬은 '정렬(sorted)' 함수를 통해 훨씬 간단한 해결책을 제공하며, 이 글에서 이에 대해 자세히 알아보겠습니다.
정렬 함수에 대한 소개
'정렬(sorted)' 함수는 파이썬에서 이터러블 객체를 정렬하는 데 사용되는 핵심 함수입니다. 이터러블 객체란 문자열, 리스트, 튜플, 세트처럼 여러 값을 포함하며 반복 처리가 가능한 모든 것을 의미합니다. 이러한 이터러블 객체들은 종종 특정 순서 없이 저장되어 있지만, '정렬(sorted)' 함수를 사용하면 값을 지정된 순서대로 정렬할 수 있습니다. 값을 정렬하는 것은 다음과 같은 여러 가지 이유로 매우 중요합니다.
- 정렬된 데이터는 이진 검색과 같은 알고리즘을 사용하여 값을 더 빠르고 효율적으로 찾을 수 있게 합니다. 물론 이진 검색을 적용하려면 데이터가 미리 정렬되어 있어야 합니다.
- 데이터를 사용자에게 보여줄 때 정렬된 형태는 더 보기 좋고 이해하기 쉽습니다. 예를 들어, 상품을 가격 순으로 보여주거나 게시물을 최신 순으로 보여주는 것이 유용할 수 있습니다.
- 통계 분석과 같이 데이터를 분석할 때, 정렬된 데이터는 가장 자주 나타나는 값을 찾거나 기타 계산을 수행하는 데 편리합니다.
정렬 함수 사용법
앞서 언급했듯이 '정렬(sorted)' 함수는 다양한 이터러블 객체에 적용 가능하며, 그 결과를 정렬된 리스트로 반환합니다. 여기서 중요한 점은 입력 값은 어떤 이터러블이든 가능하지만, 반환 값은 항상 리스트라는 것입니다.
정렬 함수의 구문
'정렬(sorted)' 함수의 기본 구문은 다음과 같습니다.
sorted(iterable, key=None, reverse=False)
여기서 필수 인수는 정렬하고자 하는 이터러블 객체 하나뿐입니다.
두 번째 인수인 'key'는 정렬에 사용할 값을 추출하기 위해 이터러블의 각 요소를 변환하는 데 사용되는 함수입니다. 이는 특히 사전의 리스트를 정렬할 때 매우 유용하게 사용됩니다. 'key' 인수의 기본값은 'None'이며, 이 경우 별도의 함수를 적용하지 않고 값 자체를 기준으로 정렬합니다.
세 번째 인수인 'reverse'는 불리언 값으로, 'True'로 설정하면 정렬된 값을 내림차순으로 반환합니다.
다음 섹션에서는 '정렬(sorted)' 함수의 실제 사용 예시를 살펴보겠습니다.
정렬 함수 사용 예시
숫자 리스트
가장 간단한 정렬 예시는 숫자 리스트를 정렬하는 것입니다. 다음 코드를 살펴보세요.
# 정렬되지 않은 숫자 리스트 numbers = [8, 4, 3, 9, 2, 0, 3] # 숫자 리스트 정렬 sorted_numbers = sorted(numbers) # 정렬된 숫자 출력 print(sorted_numbers)
위 코드의 출력 결과는 다음과 같습니다.
[0, 2, 3, 3, 4, 8, 9]

보시다시피, 숫자들이 오름차순으로 정렬되었습니다. 내림차순으로 정렬하려면 'reverse' 인수를 'True'로 설정하면 됩니다. 따라서 위의 코드 4번째 줄을 다음과 같이 수정하면 됩니다.
sorted_numbers = sorted(numbers, reverse=True)
수정된 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
[9, 8, 4, 3, 3, 2, 0]

문자열 리스트
'정렬(sorted)' 함수는 단순한 숫자뿐 아니라 문자열도 정렬할 수 있습니다. 문자열 리스트를 정렬할 때는 각 문자열의 첫 번째 문자를 비교합니다. 이때 비교는 문자의 ASCII 값을 기준으로 이루어집니다. 예를 들어, 'h'의 ASCII 값은 104이고 'w'의 ASCII 값은 119이므로 'hello'는 'world'보다 앞에 위치하게 됩니다.
만약 하나 이상의 문자열이 동일한 첫 글자로 시작한다면, 순서를 결정할 때까지 두 번째, 세 번째, 그리고 그 다음 글자를 비교합니다. 아래는 사람 이름 리스트를 정렬하는 예시 코드입니다.
# 이름 리스트 생성 members_list = ['bob', 'dave', 'charlie', 'alice'] # 이름 리스트 정렬 sorted_members_list = sorted(members_list) # 정렬된 이름 출력 print(sorted_members_list)
위 코드의 실행 결과는 다음과 같습니다.
['alice', 'bob', 'charlie', 'dave']

ASCII 값을 기준으로 정렬하기 때문에, 문자열의 순서는 ASCII 테이블에서 어떤 문자가 먼저 나오는지에 따라 결정됩니다. 예를 들어, 대문자는 ASCII 값에서 소문자보다 앞에 위치하므로, 대문자가 소문자보다 먼저 정렬됩니다. 참고로 전체 ASCII 테이블은 다음과 같습니다.
출처: commons.wikimedia.org
기타 이터러블 - 문자열, 튜플, 세트
언급했듯이 '정렬(sorted)' 함수는 모든 종류의 이터러블 객체에 적용 가능합니다. 이터러블 객체 내의 값들을 정렬하는 규칙은 모두 동일하게 적용됩니다. 다음은 몇 가지 예시입니다.
# 문자열 정렬
print(sorted("dijkstra"))
# 튜플 정렬
print(sorted((3, 4, 2, 1, 5, 0)))
# 세트 정렬
print(sorted(set([4, 5, 5, 1, 3, 8, 9])))
각 코드의 결과는 다음과 같습니다.
['a', 'd', 'i', 'j', 'k', 'r', 's', 't'] [0, 1, 2, 3, 4, 5] [1, 3, 4, 5, 8, 9]

보시는 것처럼, 모든 경우에 정렬된 리스트를 결과로 반환합니다.
사전 리스트
'정렬(sorted)' 함수를 사용하여 사전(dictionary)으로 구성된 리스트를 정렬할 수도 있습니다. 그러나 사전 정렬은 약간 더 복잡합니다. 사전은 여러 속성을 가지며, 각 속성이 정렬 기준이 될 수 있기 때문입니다.
따라서 사전을 정렬하려면 각 사전을 비교에 사용할 하나의 값으로 요약하는 함수를 정의해야 합니다. 이 함수는 'key' 인수로 '정렬(sorted)' 함수에 전달됩니다. 다음은 그 예시입니다.
people = [
{ 'name': 'Alice', 'age': 27 },
{ 'name': 'Bob', 'age': 23 },
{ 'name': 'Charlie', 'age': 25}
]
people_sorted_by_age = sorted(people, key=lambda person: person['age'])
print(people_sorted_by_age)
이 예시에서는 사전 객체로 표현된 세 사람이 있습니다. 각 객체에는 'name'과 'age'라는 속성이 있습니다. 나이 순으로 사람들을 정렬하고 싶으므로, '정렬(sorted)' 함수를 호출할 때 'key' 인수로 함수를 전달합니다.
이 함수는 사람 사전 객체를 받아서 해당 사람의 'age'를 반환합니다. 이 반환 값은 정렬에 사용됩니다. 따라서 전체 사전 객체를 비교 가능한 간단한 숫자로 요약할 수 있습니다. 여기서는 람다 함수를 사용하여 'key' 인수를 간단하게 정의했습니다.
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
[{'name': 'Bob', 'age': 23}, {'name': 'Charlie', 'age': 25}, {'name': 'Alice', 'age': 27}]

키 인수 활용 사례
'key' 인수는 사전을 정렬할 때만 필요한 것이 아닙니다. 모든 값에 적용 가능하며, 정렬에 사용할 키 값을 지정할 수 있도록 도와줍니다. 다음은 'key' 인수의 다양한 활용 사례입니다.
- 리스트의 값들의 길이를 기준으로 정렬하고 싶을 때, 'key' 함수를 통해 각 값의 길이를 반환하도록 설정할 수 있습니다.
- 리스트의 문자열을 대소문자를 구분하지 않고 정렬할 때, 'key' 함수를 통해 각 문자열을 소문자로 변환하도록 설정하여 비교할 수 있습니다.
- 여러 속성들을 결합한 복합적인 값들을 기준으로 데이터를 정렬해야 할 때, 'key' 함수를 통해 해당 값을 정의할 수 있습니다.
정렬 함수의 시간 복잡도
'정렬(sorted)' 함수의 시간 복잡도는 O(n log n)입니다. 여기서 n은 입력으로 주어진 이터러블 객체의 요소 개수를 의미합니다. 이는 함수가 병합 정렬과 삽입 정렬을 결합한 Timsort 알고리즘을 사용하기 때문입니다.
함수의 공간 복잡도는 O(n)입니다. 왜냐하면 정렬된 새로운 리스트를 생성하여 반환하기 때문입니다.
정렬 함수 vs 정렬 메서드
값을 정렬하는 또 다른 방법은 리스트 객체의 'sort' 메서드를 사용하는 것입니다. 이 섹션에서는 '정렬(sorted)' 함수와 'sort' 메서드의 주요 차이점에 대해 알아보겠습니다.
- 'sort' 메서드는 리스트 객체 자체를 직접 수정하는 반면, '정렬(sorted)' 함수는 새로운 정렬된 리스트를 생성하여 반환합니다.
- 리스트 객체 자체를 직접 수정해야 하므로, 'sort' 메서드를 사용하려면 입력값이 반드시 리스트여야 합니다. 반면 '정렬(sorted)' 함수는 모든 종류의 이터러블 객체를 입력으로 받아 새로운 정렬된 리스트를 만들 수 있습니다.
마무리
이 글에서는 '정렬(sorted)' 함수에 대해 자세히 살펴보았습니다. '정렬(sorted)' 함수가 무엇인지, 어떻게 사용하는지, 그리고 다양한 추가 인수에 대해 알아봤습니다. 또한 다양한 사용 사례와 함께 함수의 시간 복잡도, 그리고 'sort' 메서드와의 비교까지 다뤘습니다.
다음으로는 파이썬의 합계 함수에 대한 글을 읽어보시는 것을 추천합니다.