Python의 정렬 함수: sort와 sorted
알고리즘 문제풀 때 종종 필요한 한개 값 기준 정렬과 다중 기준 정렬
기준이 여러개일 때 하나를 기준으로 오름차순,, 다른 하나를 기준으로 내림차순 등 구현할 때
sorted 인자값으로 Lambda식을 전달하여야하는데 자꾸 까먹어서 포스팅으로 정리해봅니다... ㅎㅎ
우선, Python에서는 리스트(List)의 정렬을 위해 sort와 sorted를 사용할 수 있습니다.
둘 다 리스트를 정렬할 수 있다는 점에서는 같지만,
정렬 기준 및 반환값 등에서 차이점이 있습니다.
sort 메서드
sort
메서드는 리스트 객체의 메서드로 사용됩니다.
이 함수는 원본 리스트를 직접 변경하며, 정렬된 결과를 반환하지 않습니다. 따라서 원본 리스트가 정렬된 상태로 변경됩니다.
리스트
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
오름차순 : list.sort()
# 오름차순으로 정렬 (원본 리스트 변경)
numbers.sort()
print(numbers) # 출력: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
내림차순 : list.sort(reverse=True)
# 내림차순으로 정렬 (원본 리스트 변경)
numbers.sort(reverse=True)
print(numbers) # 출력: [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
sorted 함수
sorted
함수는 Python 내장 함수로 제공됩니다. 이 함수는 원본 리스트를 변경하지 않고, 정렬된 결과를 새로운 리스트로 반환합니다.
리스트
my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
오름차순
# 새로운 리스트를 오름차순으로 정렬 (원본 리스트는 변경되지 않음)
sorted_list = sorted(numbers)
print(sorted_list) # 출력: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
내림차순
# 새로운 리스트를 내림차순으로 정렬 (원본 리스트는 변경되지 않음)
sorted_list = sorted(numbers, reverse=True)
print(sorted_list) # 출력: [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
원본리스트는 그대로 유지
# 원본 리스트는 그대로 유지됨
print(numbers) # 출력: [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted 함수를 사용한 튜플 정렬(다중 정렬)
=> lambda식 사용 : sorted( tuple, key=lambda x: x[0])
리스트 내 튜플로 구성된 데이터
# fruits 리스트 내 튜플로 구성된 데이터
fruits = [('apple', 3), ('banana', 1), ('cherry', 2), ('cherry', 3), ('mango', 1), ('mango', 2)]
기준 1개:0번 인덱스 기준 오름차순
# 0번째 인덱스를 기준으로 오름차순 정렬
sorted_fruits = sorted(fruits, key=lambda x: x[0])
# 정렬된 결과 출력
for fruit in sorted_fruits:
print(fruit)
('apple', 3)
('banana', 1)
('cherry', 2)
('cherry', 3)
('mango', 1)
('mango', 2)
기준 1개:0번 인덱스 기준 내림차순
# 0번째 인덱스를 기준으로 내림차순 정렬
sorted_fruits = sorted(fruits, key=lambda x: -x[0])
# 정렬된 결과 출력
for fruit in sorted_fruits:
print(fruit)
('mango', 2)
('mango', 1)
('cherry', 3)
('cherry', 2)
('banana', 1)
('apple', 3)
기준 2개:0번 인덱스 기준 내림차순, 1번 인덱스 기준 오름차순
# 0번째 인덱스를 기준으로 오름차순 정렬, 그 후 1번째 인덱스를 기준으로 내림차순 정렬
sorted_fruits = sorted(fruits, key=lambda x: (x[0], -x[1]))
# 정렬된 결과 출력
for fruit in sorted_fruits:
print(fruit)
('apple', 3)
('banana', 1)
('cherry', 3)
('cherry', 2)
('mango', 2)
('mango', 1)
sort 와 sorted의 차이점
원본 리스트 변경:
sort: 원본 리스트를 직접 변경하며, 정렬된 결과를 반환하지 않습니다.
sorted: 원본 리스트를 변경하지 않고, 정렬된 결과를 새로운 리스트로 반환합니다.
사용 방법:
sort: 리스트 객체의 메서드로 사용됩니다.
sorted: 내장 함수로 사용됩니다.
반환 값:
sort: 반환 값이 없으며, None을 반환하며, 원본 리스트를 변경합니다.
sorted: 정렬된 새로운 리스트를 반환하며, 원본 리스트는 변경되지 않습니다.
위 차이점을 이해하시고
정렬을 구현할 때 필요한 함수, 메소드를 사용하시면 도움될 것 같습니다.