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

Python에서 특정 값(K)보다 큰 첫 번째 요소의 인덱스 구하기

Python 리스트의 요소 값들은 반드시 정렬되어 있는 것은 아닙니다. 또한 실무에서는 전체 데이터가 아니라 특정 값보다 큰 값들만 필요한 경우가 자주 발생합니다. 이번 글에서는 리스트에서 주어진 값(K)보다 큰 첫 번째 요소의 인덱스를 구하는 다양한 방법을 살펴보겠습니다.

1. enumerate()와 next() 사용하기

enumerate()를 사용하면 리스트를 순회하면서 각 요소의 인덱스와 값을 동시에 얻을 수 있습니다. 여기에 '값 > K' 조건을 적용하면 되는데, next() 함수가 제너레이터 표현식을 통해 리스트의 요소를 하나씩 차례로 검사하다가 조건을 처음 만족하는 순간 해당 인덱스를 즉시 반환합니다.

예제

List = [21, 10, 24, 40.5, 11]
print("Given list: " + str(List))

# next() + enumerate() 조합
result = next(k for k, value in enumerate(List)
              if value > 25)
print("Index is: ", result)

실행 결과

Given list: [21, 10, 24, 40.5, 11]
Index is: 3

리스트에서 25보다 큰 첫 번째 값은 40.5이며, 그 인덱스인 3이 출력됩니다.

2. filter()와 lambda 사용하기

두 번째 방법은 람다(lambda) 함수로 각 요소가 조건을 만족하는지 판별하고, filter()로 조건을 통과한 요소들만 남기는 방식입니다. 필터링된 결과 중 첫 번째 요소(인덱스 0)를 선택한 뒤, List.index()를 사용해 원래 리스트에서의 위치를 찾아냅니다.

예제

List = [21, 10, 24, 40.5, 11]
print("Given list: " + str(List))

# filter() + lambda 조합
result = list(filter(lambda k: k > 25, List))[0]
print("Index is: ", List.index(result))

실행 결과

Given list: [21, 10, 24, 40.5, 11]
Index is: 3

3. map()과 lambda 사용하기

세 번째 방법은 앞선 방식과 유사하지만 filter() 대신 map()을 사용합니다. map 함수가 각 요소를 순회하며 '값 > K' 조건의 참/거짓(True/False) 리스트를 생성하고, 그중 처음으로 True가 나타나는 위치의 인덱스를 구합니다.

예제

List = [21, 10, 24, 40.5, 11]
print("Given list: " + str(List))

# map() + lambda 조합
result = list(map(lambda k: k > 25, List)).index(True)
print("Index is: ", result)

실행 결과

Given list: [21, 10, 24, 40.5, 11]
Index is: 3

마치며

세 가지 방법 모두 동일한 결과를 반환하지만 상황에 따라 장단점이 있습니다. enumerate() + next() 조합은 조건을 만족하는 첫 번째 요소를 찾으면 즉시 순회를 멈추므로 대용량 리스트에서 가장 효율적입니다. 반면 filter()map() 방식은 리스트 전체를 먼저 처리해야 하므로 불필요한 연산이 발생할 수 있습니다.

또 한 가지 주의할 점은, 조건을 만족하는 요소가 하나도 없을 경우 next() 방식은 StopIteration 오류가 발생한다는 것입니다. 이런 경우에는 next((k for k, v in enumerate(List) if v > 25), None)처럼 기본값을 지정해 안전하게 처리하는 것이 좋습니다.