이 글에서는 주어진 숫자 리스트에서 0이 아닌 첫 번째 숫자가 어디에 위치하는지 찾는 방법을 알아봅니다. 데이터 전처리나 유효성 검사 작업을 할 때 자주 필요한 기능으로, Python에서는 간결하고 효율적인 여러 가지 방법으로 구현할 수 있습니다.
enumerate와 next 활용하기
첫 번째 방법은 enumerate 함수를 사용해 리스트의 모든 요소를 인덱스와 함께 순회한 뒤, next 함수로 조건을 만족하는 첫 번째 요소를 가져오는 방식입니다. 제너레이터 표현식 내부에서 값이 0이 아닌 경우만 필터링하며, 만약 0이 아닌 숫자가 존재하지 않으면 None을 반환하도록 처리할 수 있습니다.
예제 코드
listA = [0,0,13,4,17]
# 주어진 리스트
print("Given list:\n " ,listA)
# enumerate 사용
res = next((i for i, j in enumerate(listA) if j), None)
# 결과 출력
print("The first non zero number is at: \n",res)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Given list: [0, 0, 13, 4, 17] The first non zero number is at: 2
리스트에서 세 번째 요소인 13이 처음 등장하는 0이 아닌 숫자이므로, 해당 요소의 인덱스인 2가 출력됩니다. 이 방법은 중간에 조건을 만족하는 값을 발견하면 즉시 순회를 멈추기 때문에 대용량 리스트에서도 성능이 우수합니다.
next와 filter 활용하기
두 번째 방법은 filter 함수와 lambda 표현식을 결합하는 방식입니다. lambda 조건식으로 0이 아닌 요소만 걸러낸 후, next로 그중 첫 번째 값을 추출하고 index 메서드로 해당 값의 위치를 확인합니다.
예제 코드
listA = [0,0,13,4,17]
# 주어진 리스트
print("Given list:\n " ,listA)
# next, filter, lambda 사용
res = listA.index(next(filter(lambda i: i != 0, listA)))
# 결과 출력
print("The first non zero number is at: \n",res)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Given list: [0, 0, 13, 4, 17] The first non zero number is at: 2
마무리
두 방법 모두 동일한 결과를 반환하지만 상황에 따라 적합성이 다릅니다. enumerate 방식은 한 번의 순회로 인덱스를 바로 얻을 수 있고, 조건에 맞는 값이 없을 때 기본값(None)을 지정할 수 있어 안전합니다. 반면 filter 방식은 코드가 직관적이지만, 리스트에 0이 아닌 값이 하나도 없을 경우 StopIteration 예외가 발생할 수 있으므로 이에 대한 예외 처리를 추가하는 것이 좋습니다. 실무에서는 데이터 특성에 맞게 두 방식 중 하나를 선택하거나 예외 처리를 보완하여 사용하시기 바랍니다.