Python으로 데이터 분석을 하다 보면 리스트에서 특정 조건을 만족하는 요소만 골라내야 하는 상황이 자주 발생합니다. 이번 글에서는 주어진 값 k보다 큰 요소들 중에서 가장 작은 값을 찾는 세 가지 방법을 예제 코드와 함께 살펴보겠습니다.
1. min 함수와 제너레이터 표현식 활용
리스트의 각 요소를 순회하면서 값이 k보다 큰 요소만 추출한 뒤, min 함수를 적용해 그중 최솟값을 구하는 방법입니다. 코드가 간결하고 직관적이라 가장 널리 쓰이는 방식입니다.
예제
listA = [1, 5, 6, 7, 11, 14]
# 원본 리스트 출력
print("Given list : ", listA)
k = 8
# min과 제너레이터 표현식 사용
res = min(i for i in listA if i > k)
# 결과 출력
print("k보다 큰 최소 요소 : \n", res)실행 결과
Given list : [1, 5, 6, 7, 11, 14] k보다 큰 최소 요소 : 11
2. filter 함수와 lambda 활용
lambda 함수로 k보다 큰 값을 판별하고, filter 함수를 통해 해당 조건을 만족하는 요소만 걸러냅니다. 이후 min 함수를 적용하면 최종 결과를 얻을 수 있습니다.
예제
listA = [1, 5, 6, 7, 11, 14]
# 원본 리스트 출력
print("Given list : ", listA)
k = 8
# filter와 lambda 사용
res = min(filter(lambda i: i > k, listA))
# 결과 출력
print("k보다 큰 최소 요소 : \n", res)실행 결과
Given list : [1, 5, 6, 7, 11, 14] k보다 큰 최소 요소 : 11
3. bisect 모듈의 bisect_right 활용
bisect 모듈의 bisect_right 함수는 정렬된 리스트에서 특정 값이 들어갈 수 있는 위치(삽입 지점)를 오른쪽 기준으로 반환합니다. 리스트를 먼저 정렬한 후 bisect_right를 적용하면, k보다 큰 첫 번째 요소의 인덱스를 얻을 수 있습니다.
이 방법은 정렬에 O(n log n)이 필요하지만, 한 번 정렬해 두면 이후 탐색은 O(log n)으로 처리되므로 동일한 리스트에서 여러 번 조회해야 하는 경우 특히 유용합니다.
예제
from bisect import bisect_right
listA = [1, 5, 6, 7, 11, 14]
# 원본 리스트 출력
print("Given list : ", listA)
k = 8
# 리스트 정렬 후 bisect_right 적용
listA.sort()
res = listA[bisect_right(listA, k)]
# 결과 출력
print("k보다 큰 최소 요소 : \n", res)실행 결과
Given list : [1, 5, 6, 7, 11, 14] k보다 큰 최소 요소 : 11
정리
세 방법 모두 동일하게 11을 반환합니다. 간단한 일회성 조회라면 min + 제너레이터 표현식이나 filter + lambda가 코드가 짧고 읽기 쉽고, 이미 정렬된 데이터나 반복 조회가 많은 상황에서는 bisect_right가 성능 면에서 유리합니다. 상황에 맞는 방법을 선택해 사용하시기 바랍니다.