튜플(tuple)에서 최댓값과 최솟값에 해당하는 K개의 요소를 추출해야 하는 경우가 종종 있습니다. 이럴 때는 파이썬의 내장 함수인 sorted()를 사용해 모든 요소를 오름차순으로 정렬한 뒤, 정렬된 결과를 순회하면서 앞쪽 K개(최솟값 그룹)와 뒤쪽 K개(최댓값 그룹)의 요소만 골라내면 됩니다.
아래 예제를 통해 구체적인 동작 방식을 살펴보겠습니다.
예제 코드
my_tuple = (7, 25, 36, 9, 6, 8)
print("The tuple is : ")
print(my_tuple)
K = 2
print("The value of K has been initialized to ")
print(K)
my_result = []
my_tuple = list(my_tuple)
temp = sorted(my_tuple)
for idx, val in enumerate(temp):
if idx < K or idx >= len(temp) - K:
my_result.append(val)
my_result = tuple(my_result)
print("The result is : " )
print(my_result)실행 결과
The tuple is : (7, 25, 36, 9, 6, 8) The value of K has been initialized to 2 The result is : (6, 7, 25, 36)
코드 설명
먼저 튜플을 하나 정의하고, 콘솔에 출력하여 확인합니다.
추출할 요소의 개수를 나타내는 K 값을 설정합니다. 여기서는 2로 초기화했습니다.
결과를 담기 위한 빈 리스트를 생성합니다.
튜플은 불변(immutable) 자료형이므로, 정렬 작업을 위해
list()를 사용해 리스트로 변환합니다.sorted()함수로 요소들을 오름차순 정렬한 뒤 별도의 변수에 저장합니다.enumerate()로 정렬된 리스트를 순회하면서, 인덱스가 K보다 작거나 (리스트 길이 − K)보다 크거나 같은 경우 해당 값을 결과 리스트에 추가합니다. 즉, 가장 작은 K개와 가장 큰 K개의 요소가 선택됩니다.마지막으로 결과 리스트를 다시 튜플로 변환한 뒤 콘솔에 출력합니다.
참고: heapq를 활용한 더 효율적인 방법
요소 개수가 많은 대용량 데이터를 다룰 때는 전체를 정렬하는 것보다 heapq 모듈의 nsmallest()와 nlargest() 함수를 사용하는 것이 성능 면에서 유리합니다.
import heapq my_tuple = (7, 25, 36, 9, 6, 8) K = 2 result = tuple(sorted(heapq.nsmallest(K, my_tuple) + heapq.nlargest(K, my_tuple))) print(result) # (6, 7, 25, 36)
이 방법은 전체 정렬(O(n log n))과 달리 필요한 개수만큼만 추출하므로, 데이터가 클수록 실행 시간을 크게 줄일 수 있다는 장점이 있습니다.