Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 K보다 큰 요소 중 가장 작은 값 찾는 3가지 방법

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가 성능 면에서 유리합니다. 상황에 맞는 방법을 선택해 사용하시기 바랍니다.