파이썬에서 목록을 정렬하는 방법
이 글에서는 파이썬에서 리스트를 정렬하는 다양한 방법에 대해 자세히 알아봅니다.
파이썬에서는 `sort()` 메서드를 활용하여 리스트 자체를 직접 정렬할 수 있습니다. 또는, 내장 함수인 `sorted()`를 사용하여 원본 리스트의 복사본을 정렬된 형태로 얻을 수도 있습니다.
본 튜토리얼을 통해 다음 내용들을 학습할 수 있습니다:
- `sort()` 메서드와 `sorted()` 함수의 사용법 및 문법
- 리스트를 오름차순 및 내림차순으로 정렬하는 다양한 코드 예시
- `key` 매개변수를 활용한 사용자 정의 정렬 방법
- `sort()`와 `sorted()` 함수의 주요 차이점
이제 함께 시작해 볼까요! 👩🏽💻
파이썬 `sort()` 메서드의 구문
`sort()` 메서드는 파이썬 리스트 객체에 적용되며, 리스트를 직접 변경하여 원본 리스트 자체를 정렬합니다.
파이썬 `sort()` 메서드의 기본 구문은 다음과 같습니다.
<리스트>.sort(reverse = True | False, key = <함수>)
위 구문을 좀 더 자세히 분석해 보겠습니다.
- `<리스트>`는 유효한 파이썬 리스트 객체를 나타냅니다.
- `reverse`는 선택적 매개변수로, `True` 또는 `False` 값을 가질 수 있습니다.
- `reverse`의 기본값은 `False`이며, 이 경우 리스트는 오름차순으로 정렬됩니다. 내림차순 정렬을 원한다면 `True` 값을 지정해야 합니다.
- `key` 역시 선택적 매개변수이며, 함수(`<함수>`)를 값으로 설정할 수 있습니다.
- `<함수>`는 내장 함수 또는 사용자 정의 함수가 될 수 있습니다.
다음 섹션부터는 실제 예제 코드를 통해 학습해 보겠습니다.
오름차순으로 파이썬 리스트 정렬하기
숫자 리스트를 예시로 들어보겠습니다. 이 리스트를 오름차순으로 정렬하려면 리스트 객체에서 `sort()` 메서드를 호출하면 됩니다.
▶ 다음 코드를 실행해 보세요.
numbers = [25, 13, 6, 17, 9] numbers.sort() print(numbers) # 출력 결과: [6, 9, 13, 17, 25]
보시다시피, 리스트 내 숫자들이 오름차순으로 정렬되었으며, 원본 리스트 자체가 변경되었습니다. 이러한 방식을 "제자리 정렬"이라고 합니다.
내림차순으로 파이썬 리스트 정렬하기
리스트를 내림차순으로 정렬하고 싶다면, 아래 코드처럼 `reverse` 매개변수를 `True`로 설정하면 됩니다.
numbers = [25, 13, 6, 17, 9] numbers.sort(reverse = True) print(numbers) # 출력 결과: [25, 17, 13, 9, 6]
이제 리스트가 내림차순으로 정확히 정렬된 것을 확인할 수 있습니다.
파이썬 `sort()` 메서드에서 `key` 활용하기
이번 섹션에서는 `key` 매개변수를 활용하여 정렬 방식을 사용자 정의하는 방법을 살펴보겠습니다.
여기서 `mod5()` 함수는 입력받은 숫자 `x`를 5로 나눈 나머지를 반환합니다.
def mod5(x): return x % 5
이제 위에서 정의한 함수를 `key` 매개변수로 사용하여 리스트를 정렬해 보겠습니다.
다음 코드를 실행해 보세요.
numbers = [25, 13, 6, 17, 9] numbers.sort(key = mod5) print(numbers) # 출력 결과: [25, 6, 17, 13, 9]
출력 결과를 자세히 살펴보세요.
일반적인 정렬 방식 대신, `mod5` 함수에 의해 반환된 값(나머지)을 기준으로 리스트가 정렬된 것을 확인할 수 있습니다.
- 5로 나눈 나머지가 가장 작은 숫자가 먼저 정렬됩니다.
- 반대로, 5로 나눈 나머지가 가장 큰 숫자가 정렬된 리스트의 마지막 요소가 됩니다.
이러한 결과를 좀 더 명확하게 확인하기 위해 다음 코드를 실행해 보겠습니다.
numbers = [25, 13, 6, 17, 9]
for number in numbers:
print(f"{number}를 5로 나눈 나머지는 {number%5}입니다.")
# 출력 결과
25를 5로 나눈 나머지는 0입니다.
13를 5로 나눈 나머지는 3입니다.
6를 5로 나눈 나머지는 1입니다.
17를 5로 나눈 나머지는 2입니다.
9를 5로 나눈 나머지는 4입니다.
25는 5로 나누어 떨어지므로 나머지가 0이 되어 정렬된 리스트의 첫 번째 요소가 됩니다. 6은 나머지가 1이므로 두 번째 요소가 되는 방식입니다. 9는 5로 나눌 때 나머지가 4이므로 정렬된 리스트의 마지막 요소가 됩니다.
별도의 함수를 정의하는 대신 람다 함수를 활용할 수도 있습니다. 파이썬 람다는 한 줄로 작성 가능한 익명 함수입니다. `lambda 인자: 표현식` 형태로, 인자를 받아서 표현식의 결과를 반환합니다.
이제 람다 표현식을 사용하여 위에서 수행한 정렬을 다시 구현해 보겠습니다.
numbers = [25, 13, 6, 17, 9] numbers.sort(key = lambda x: x % 5) print(numbers) # 출력 결과: [25, 6, 17, 13, 9]
지금까지 숫자 리스트를 정렬하는 방법을 살펴보았습니다. 다음으로는 문자열 리스트를 정렬하는 방법을 알아보겠습니다.
알파벳 순서로 파이썬 리스트 정렬하기
이번 섹션에서는 해리 포터에서 영감을 받은 예제를 통해 문자열 리스트를 정렬하는 방법을 배우게 될 것입니다. ✨
예를 들어, `students` 리스트는 호그와트 학생들의 이름 목록이라고 가정해 봅시다. 이 리스트를 학생 이름의 알파벳 순서대로 정렬하고자 합니다.
문자열 리스트를 정렬할 때 기본 정렬 방식은 알파벳 순서입니다.
students = ["Harry", "Ron", "Hermione", "Draco", "Cedric"]
정렬 결과를 확인하기 위해 정렬된 리스트를 출력해 보겠습니다.
students.sort() print(students) # 출력 결과 ['Cedric', 'Draco', 'Harry', 'Hermione', 'Ron']
알파벳 역순으로 파이썬 리스트 정렬하기
리스트를 알파벳 역순으로 정렬하려면, 아래 코드와 같이 `reverse = True`로 설정하면 됩니다.
students.sort(reverse = True) print(students) # 출력 결과 ['Ron', 'Hermione', 'Harry', 'Draco', 'Cedric']
출력 결과를 통해 리스트가 실제로 역순으로 정렬되었음을 확인할 수 있습니다.
`key` 매개변수를 사용한 사용자 정의 정렬
이번 섹션에서는 선택적 `key` 매개변수를 활용하여 정렬을 좀 더 사용자 정의하는 방법을 알아보겠습니다.
다음과 같은 리스트, `houses`를 예로 들어보겠습니다.
houses = [
{1: "Draco", "house": "Slytherin"},
{2: "Harry", "house": "Gryffindor"},
{3: "Cedric", "house": "Hufflepuff"}
]
여기서 `houses`는 사전(딕셔너리)의 리스트입니다. 각 사전에는 두 개의 키-값 쌍이 있습니다. 하나는 학생의 이름을 나타내고, 다른 하나는 학생이 속한 기숙사를 나타냅니다.
이제 이 `houses` 리스트를 각 학생이 속한 기숙사의 알파벳 순서대로 정렬해 보겠습니다.
짐작하셨겠지만, `key` 매개변수를 특정 학생의 기숙사 이름으로 설정해야 합니다.
각 학생의 기숙사 정보를 얻기 위해, 아래와 같이 `returnHouse()` 함수를 정의할 수 있습니다.
def returnHouse(student): return student["house"]
이 함수는 특정 학생이 속한 기숙사 이름을 반환합니다.
이제 위에서 정의한 함수를 `key` 매개변수로 사용하여 `houses` 리스트의 `sort()` 메서드를 호출해 보겠습니다.
houses.sort(key = returnHouse)
아래 출력 결과를 보면, 리스트가 학생 이름이 아닌 기숙사를 기준으로 정렬된 것을 확인할 수 있습니다. 기숙사 이름은 알파벳 순서대로 그리핀도르, 후플푸프, 슬리데린 순서입니다.
print(houses)
# 출력 결과
[{2: 'Harry', 'house': 'Gryffindor'},
{3: 'Cedric', 'house': 'Hufflepuff'},
{1: 'Draco', 'house': 'Slytherin'}]
마찬가지로 람다 함수를 사용하여 `key` 매개변수를 정의할 수도 있습니다. 람다 함수는 각 리스트 항목에 대해 해당 항목의 기숙사 이름을 반환합니다.
▶ 다음 코드를 실행하여 직접 확인해 보세요.
houses.sort(key = lambda student: student["house"])
print(houses)
# 출력 결과
[{2: 'Harry', 'house': 'Gryffindor'},
{3: 'Cedric', 'house': 'Hufflepuff'},
{1: 'Draco', 'house': 'Slytherin'}]
지금까지 모든 예제에서 리스트 객체의 `sort()` 메서드를 사용했습니다. 이 메서드는 원본 리스트 자체를 변경한다는 것을 배웠습니다.
원본 리스트는 그대로 유지하고 정렬된 새로운 리스트를 얻고 싶을 때는 어떻게 해야 할까요?
이러한 경우, 파이썬에서는 `sorted()` 함수를 활용할 수 있습니다.
파이썬 `sorted()` 함수의 구문
`sorted()` 함수는 리스트나 다른 컬렉션(iterable)을 인수로 받아, 정렬된 새로운 복사본을 반환하며 원본은 변경하지 않습니다.
파이썬 `sorted()` 함수의 기본적인 구문은 다음과 같습니다.
<정렬된_복사본> = sorted(<리스트>, reverse = True | False, key = <함수>)
구문이 이전에 살펴본 `sort()` 메서드와 매우 유사하다는 점에 주목하세요.
- `<리스트>`는 유효한 파이썬 리스트 객체이며, 필수 매개변수입니다.
- `reverse`와 `key`는 선택적 매개변수입니다.
참고: `sort()` 메서드는 리스트에서만 사용 가능한 반면, `sorted()` 함수는 리스트, 문자열, 딕셔너리 등과 같은 다양한 파이썬 iterable을 정렬하는 데 활용할 수 있습니다.
`sorted()` 함수를 사용하여 파이썬 리스트 정렬하기
#1. 아래 예제에서는 `numbers`라는 숫자 리스트를 사용합니다.
`numbers` 리스트를 인수로 `sorted()` 함수를 호출한 후, 그 결과를 `sorted_nums1` 리스트에 할당합니다.
numbers = [25, 13, 6, 17, 9] sorted_nums1 = sorted(numbers) print(sorted_nums1) # 출력 결과: [6, 9, 13, 17, 25]
위 출력에서 숫자 리스트가 기본적으로 오름차순으로 정렬된 것을 볼 수 있습니다.
또한, `sorted()` 함수는 새로운 리스트를 반환하므로 원본 리스트인 `numbers`는 변경되지 않습니다. 아래 출력을 통해 이를 확인할 수 있습니다.
print(numbers) # 출력 결과: [25, 13, 6, 17, 9]
#2. 이번에는 선택적 매개변수인 `reverse`를 `True`로 설정하고, 결과를 `sorted_nums2`에 할당해 보겠습니다.
아래 코드에서 볼 수 있듯이, `sorted_nums2`는 항목이 내림차순으로 정렬된 새로운 리스트입니다.
sorted_nums2 = sorted(numbers, reverse = True) print(sorted_nums2) # 출력 결과: [25, 17, 13, 9, 6]
#3. 이번에는 문자열 리스트를 예제로 사용해 보겠습니다.
이전과 마찬가지로, `sorted()` 함수를 호출하면 새로운 리스트가 반환됩니다. 리스트 내 항목은 알파벳 순서로 정렬됩니다.
fruits = ['pear', 'strawberry', 'apple', 'pineapple', 'blueberry'] sorted_fr1 = sorted(fruits) print(sorted_fr1) # 출력 결과: ['apple', 'blueberry', 'pear', 'pineapple', 'strawberry']
#4. 이제 선택적 `key` 매개변수를 사용하여 정렬을 사용자 정의해 보겠습니다. `key`를 `len`으로 설정하면, 문자열의 길이에 따라 리스트가 정렬됩니다.
참고: 파이썬 내장 함수인 `len()`은 리스트, 문자열, 튜플 등과 같은 모든 iterable을 인수로 받을 수 있으며, 해당 iterable의 길이를 반환합니다.
길이가 가장 짧은 문자열이 정렬된 리스트에서 가장 먼저 나타나며, 길이가 가장 긴 문자열이 리스트의 마지막에 나타납니다.
fruits = ['pear', 'strawberry', 'apple', 'pineapple', 'blueberry'] sorted_fr2 = sorted(fruits, key = len) print(sorted_fr2) # 출력 결과: ['pear', 'apple', 'pineapple', 'blueberry', 'strawberry']
위 출력 결과에서 'pear'가 가장 짧은 문자열이며, 'strawberry'가 가장 긴 문자열임을 확인할 수 있습니다.
파이썬 `sort()` 메서드와 `sorted()` 함수의 비교
지금까지 `sort()` 메서드와 `sorted()` 함수를 사용하는 방법을 살펴보았습니다. 이번 섹션에서는 이 두 가지 방법의 주요 차이점을 정리해 보겠습니다.
| 파이썬 `.sort()` 메서드 | 파이썬 `sorted()` 함수 |
| 리스트 자체를 직접 정렬 (원본 리스트 변경) | 정렬된 새로운 리스트를 반환 |
| 파이썬 리스트에서만 사용 가능 | 리스트, 문자열, 기타 컬렉션과 같은 다양한 파이썬 iterable에서 사용 가능 |
| 반환 값이 없음 (None) | iterable의 정렬된 복사본을 반환 |
요약 👩🏫
이 파이썬 리스트 튜토리얼이 여러분께 도움이 되었기를 바랍니다.
지금까지 살펴본 내용을 간단히 요약해 보겠습니다.
- `list.sort(reverse = True | False, key = <함수>)`와 같이 `reverse` 및 `key` 매개변수를 활용하여 리스트 자체를 직접 정렬할 수 있습니다.
- `sorted(list, reverse = True | False, key = <함수>)`를 사용하여 원본 리스트의 정렬된 복사본을 얻을 수 있습니다.
이제 파이썬 리스트를 정렬하는 방법을 배웠으므로, 파이썬의 리스트 컴프리헨션에 대해 알아보거나, 파이썬에서 파일을 처리하거나 JSON 파일을 다루는 방법을 배울 수도 있습니다.
koreantech.org 온라인 파이썬 컴파일러에서 위에 제시된 예제 코드를 직접 실행해 볼 수 있습니다.