파이썬에서 데이터를 정렬하는 방법은 매우 직관적이며, 다양한 자료형을 손쉽게 정렬할 수 있는 기능을 제공합니다. 이번 글에서는 파이썬에서 데이터를 정렬하는 방법을 다양한 예시와 함께 설명하겠습니다. 파이썬의 sort()
와 sorted()
함수는 기본적인 정렬 기능을 제공하며, 이 두 함수의 차이점과 다양한 활용법을 알아보겠습니다.
1. sort()
와 sorted()
의 차이점
파이썬에서 데이터를 정렬할 때, 주로 두 가지 방법을 사용합니다.
sort()
: 리스트 객체의 메서드로, 리스트 자체를 직접 수정하여 정렬합니다(제자리 정렬).
sorted()
: 모든 시퀀스(리스트, 튜플 등)에 사용할 수 있으며, 원본 데이터는 변경하지 않고 정렬된 새로운 리스트를 반환합니다.
예시
# 리스트의 sort() 메서드
numbers = [5 , 2 , 9 , 1 , 5 , 6 ]
numbers.sort()
print (numbers) # 출력: [1, 2, 5, 5, 6, 9]
# sorted() 함수
numbers = [5 , 2 , 9 , 1 , 5 , 6 ]
sorted_numbers = sorted (numbers)
print (sorted_numbers) # 출력: [1, 2, 5, 5, 6, 9]
print (numbers) # 원본 리스트는 그대로: [5, 2, 9, 1, 5, 6]
[1, 2, 5, 5, 6, 9]
[1, 2, 5, 5, 6, 9]
[5, 2, 9, 1, 5, 6]
sort()
는 리스트 자체를 수정하지만, sorted()
는 원본 데이터를 그대로 유지하면서 정렬된 새로운 리스트를 반환합니다.
2. 기본 정렬: 오름차순
파이썬의 기본 정렬 방식은 오름차순 입니다. 리스트나 다른 시퀀스 자료형을 sort()
나 sorted()
를 사용하면 기본적으로 작은 값에서 큰 값으로 정렬됩니다.
numbers = [3 , 1 , 4 , 1 , 5 , 9 , 2 , 6 ]
# sort()를 이용한 오름차순 정렬
numbers.sort()
print (numbers) # 출력: [1, 1, 2, 3, 4, 5, 6, 9]
# sorted()를 이용한 오름차순 정렬
numbers = [3 , 1 , 4 , 1 , 5 , 9 , 2 , 6 ]
sorted_numbers = sorted (numbers)
print (sorted_numbers) # 출력: [1, 1, 2, 3, 4, 5, 6, 9]
[1, 1, 2, 3, 4, 5, 6, 9]
[1, 1, 2, 3, 4, 5, 6, 9]
3. 내림차순 정렬
정렬 순서를 반대로 하고 싶을 때는 reverse=True
옵션을 사용하면 됩니다.
numbers = [3 , 1 , 4 , 1 , 5 , 9 , 2 , 6 ]
# sort()로 내림차순 정렬
numbers.sort(reverse= True )
print (numbers) # 출력: [9, 6, 5, 4, 3, 2, 1, 1]
# sorted()로 내림차순 정렬
numbers = [3 , 1 , 4 , 1 , 5 , 9 , 2 , 6 ]
sorted_numbers = sorted (numbers, reverse= True )
print (sorted_numbers) # 출력: [9, 6, 5, 4, 3, 2, 1, 1]
[9, 6, 5, 4, 3, 2, 1, 1]
[9, 6, 5, 4, 3, 2, 1, 1]
4. 문자열 정렬
리스트에 문자열이 포함된 경우, 알파벳 순으로 정렬됩니다. 기본적으로 소문자가 대문자보다 뒤에 정렬됩니다.
words = ["banana" , "apple" , "cherry" , "date" ]
# 문자열 리스트 정렬
words.sort()
print (words) # 출력: ['apple', 'banana', 'cherry', 'date']
# sorted()로 문자열 정렬
words = ["banana" , "apple" , "cherry" , "date" ]
sorted_words = sorted (words)
print (sorted_words) # 출력: ['apple', 'banana', 'cherry', 'date']
['apple', 'banana', 'cherry', 'date']
['apple', 'banana', 'cherry', 'date']
대소문자 구분 없이 정렬하기
문자열의 대소문자를 무시하고 정렬하려면 key=str.lower
옵션을 사용합니다.
words = ["Banana" , "apple" , "Cherry" , "date" ]
# 대소문자 구분 없이 정렬
sorted_words = sorted (words, key= str .lower)
print (sorted_words) # 출력: ['apple', 'Banana', 'Cherry', 'date']
['apple', 'Banana', 'Cherry', 'date']
5. 복잡한 데이터 구조 정렬
파이썬에서는 key
인자를 사용하여 복잡한 데이터 구조도 쉽게 정렬할 수 있습니다. 예를 들어, 딕셔너리나 튜플의 특정 요소를 기준으로 정렬할 수 있습니다.
1. 딕셔너리 리스트 정렬
딕셔너리 리스트를 정렬할 때는 key
인자를 사용하여 딕셔너리의 특정 키 값을 기준으로 정렬합니다.
students = [
{"name" : "John" , "age" : 20 },
{"name" : "Jane" , "age" : 22 },
{"name" : "Dave" , "age" : 19 },
]
# age를 기준으로 정렬
students.sort(key= lambda student: student["age" ])
print (students)
# 출력: [{'name': 'Dave', 'age': 19}, {'name': 'John', 'age': 20}, {'name': 'Jane', 'age': 22}]
[{'name': 'Dave', 'age': 19}, {'name': 'John', 'age': 20}, {'name': 'Jane', 'age': 22}]
lambda student: student["age"]
는 파이썬의 람다 함수(익명 함수)를 사용하여 student라는 매개변수를 받아, 그 객체에서 “age” 라는 키에 해당하는 값을 반환하는 함수입니다. 이를 더 자세히 설명하면 다음과 같습니다.
2. 튜플 리스트 정렬
튜플 리스트를 정렬할 때도 key
인자를 사용하여 특정 인덱스를 기준으로 정렬할 수 있습니다.
tuples = [(1 , 'apple' ), (3 , 'banana' ), (2 , 'cherry' )]
# 첫 번째 요소를 기준으로 정렬
tuples.sort(key= lambda x: x[0 ])
print (tuples) # 출력: [(1, 'apple'), (2, 'cherry'), (3, 'banana')]
# 두 번째 요소를 기준으로 정렬
tuples.sort(key= lambda x: x[1 ])
print (tuples) # 출력: [(1, 'apple'), (3, 'banana'), (2, 'cherry')]
[(1, 'apple'), (2, 'cherry'), (3, 'banana')]
[(1, 'apple'), (3, 'banana'), (2, 'cherry')]
6. 다중 기준 정렬
여러 기준을 사용해 데이터를 정렬할 수도 있습니다. 예를 들어, 학생 리스트에서 나이를 기준으로 정렬한 후, 나이가 같다면 이름을 기준으로 정렬할 수 있습니다.
students = [
{"name" : "John" , "age" : 22 },
{"name" : "Jane" , "age" : 20 },
{"name" : "Dave" , "age" : 20 },
]
# 나이를 기준으로 먼저 정렬하고, 나이가 같으면 이름으로 정렬
students.sort(key= lambda student: (student["age" ], student["name" ]))
print (students)
# 출력: [{'name': 'Dave', 'age': 20}, {'name': 'Jane', 'age': 20}, {'name': 'John', 'age': 22}]
[{'name': 'Dave', 'age': 20}, {'name': 'Jane', 'age': 20}, {'name': 'John', 'age': 22}]
7. 튜플과 문자열의 정렬
튜플이나 문자열은 리스트와 같은 방식으로 정렬됩니다. 문자열을 문자 단위로 나누어 정렬하거나, 튜플의 각 요소를 기준으로 정렬할 수 있습니다.
# 문자열 정렬
string = "python"
sorted_string = sorted (string)
print (sorted_string) # 출력: ['h', 'n', 'o', 'p', 't', 'y']
# 튜플 정렬
tuples = (3 , 1 , 2 )
sorted_tuples = sorted (tuples)
print (sorted_tuples) # 출력: [1, 2, 3]
['h', 'n', 'o', 'p', 't', 'y']
[1, 2, 3]