프로그래밍을 하다 보면 여러 값이 담긴 목록을 특정 조건에 따라 걸러내야 하는 경우가 자주 생깁니다. 예를 들어 쿠키 가게의 주문 목록에서 초콜릿 쿠키 주문만 골라내야 하거나, 영화관에서 18세 미만 관객 수만 집계해야 할 수도 있습니다.
이럴 때 유용하게 쓸 수 있는 것이 바로 파이썬의 filter() 함수입니다. filter()는 리스트, 셋(set), 튜플 같은 반복 가능한 객체(iterable)를 미리 정의한 조건에 따라 걸러내고, 필터링된 결과를 반환합니다.
이 글에서는 filter() 함수의 개념과 문법, 그리고 실제 코드에서 활용하는 방법을 예제와 함께 자세히 살펴보겠습니다.
Python filter() 함수란?
리스트는 공통된 주제를 가진 여러 값을 저장할 수 있는 파이썬의 대표적인 자료형입니다. 예를 들어 패션 매장의 판매 의류 전체 목록이나, 다양한 프로그래밍 언어 이름 목록을 리스트로 저장할 수 있습니다.
리스트를 다루다 보면 특정 기준에 맞는 항목만 남기고 나머지는 제외하고 싶은 순간이 자주 옵니다. 이때 filter() 함수를 사용하면 손쉽게 원하는 데이터만 추출할 수 있습니다.
filter()는 파이썬에 기본으로 내장된 함수로, 조건에 맞는 요소만 걸러낸 결과를 이터레이터(iterator) 형태로 반환합니다. 기본 문법은 다음과 같습니다.
filter(function, iterable_object)
filter() 함수는 두 개의 매개변수를 받습니다.
- function: 지정한 iterable의 각 항목에 실행할 함수입니다(필수). 이 함수는 각 항목이 조건을 만족하는지 판별해 True 또는 False를 반환합니다.
- iterable_object: 필터링하려는 대상 객체입니다(필수).
iterable 자리에는 리스트, 셋, 튜플 등 반복 가능한 어떤 객체든 사용할 수 있습니다.
filter() 함수 사용 예제
실제 예제를 통해 이 함수가 어떻게 동작하는지 살펴보겠습니다.
예제 1: 잡지 재고 확인하기
잡지 가게를 운영한다고 가정해 보겠습니다. 어떤 잡지의 재고가 20권 미만이면 새로 발주해야 하고, 20권 이상이면 발주할 필요가 없습니다. 현재 보유한 잡지 수량은 다음 리스트에 저장되어 있습니다.
quantities = [25, 49, 21, 17, 14, 28] def checkQuantities(mags): if mags < 20: return True else: return False filtered_mags = filter(checkQuantities, quantities) print(list(filtered_mags))
실행 결과: [17, 14]
코드를 하나씩 분석해 보겠습니다. 첫 번째 줄에서는 quantities 변수를 정의해 각 잡지의 보유 수량을 저장합니다.
그다음 checkQuantities 함수를 정의합니다. 이 함수는 특정 잡지의 재고가 20권 미만인지 확인하고, 조건을 만족하면 True를, 그렇지 않으면 False를 반환합니다.
이후 filter() 함수에 checkQuantities를 함수로, quantities를 iterable로 지정합니다. 이렇게 하면 quantities 리스트의 모든 항목에 대해 checkQuantities가 차례로 실행됩니다.
마지막으로 list()를 사용해 결과를 리스트로 변환한 뒤 출력합니다. filter()는 리스트가 아닌 필터 객체를 반환하기 때문에, 데이터를 눈으로 확인하려면 리스트로 변환하는 과정이 반드시 필요합니다.
결과로 17과 14 두 값이 출력되었습니다. 두 값 모두 20 미만이므로 프로그램이 의도한 대로 동작한 것입니다.
예제 2: 특정 연령대 학생 찾기
또 다른 예제를 살펴보겠습니다. 댄스 강사라고 가정하고, 수강생 중 나이가 7세 이상 10세 이하인 학생들의 나이만 알고 싶다고 해보죠. 다음 코드로 이 데이터를 얻을 수 있습니다.
student_ages = [7, 9, 8, 10, 11, 11, 8, 9, 12] def checkAges(ages): if ages >= 7 and ages <= 10: return True else: return False filtered_ages = filter(checkAges, student_ages) print(list(filtered_ages))
실행 결과: [7, 9, 8, 10, 8, 9]. 7세와 10세를 포함해 해당 범위에 속하는 학생들만 걸러져 새 리스트에 담긴 것을 확인할 수 있습니다.
람다(Lambda) 함수와 함께 사용하기
필터링 작업을 더 효율적으로 처리하고 싶다면 람다(lambda) 함수를 활용할 수 있습니다. 람다는 이름 없이 정의되는 익명 함수로, 한 줄짜리 짧은 함수를 작성할 때 특히 유용합니다.
앞서 살펴본 잡지 재고 예제를 람다 함수로 다시 작성하면 코드를 훨씬 간결하게 만들 수 있습니다.
quantities = [25, 49, 21, 17, 14, 28] filtered_mags = filter(lambda mag: mag < 20, quantities) print(list(filtered_mags))
실행 결과: [17, 14]
출력 결과는 이전과 완전히 동일하지만, 코드 길이가 크게 줄어든 것을 볼 수 있습니다. 별도의 함수를 정의하는 대신 람다로 한 줄 함수를 정의했기 때문입니다. 이 한 줄 함수는 재고가 20권 미만인지 확인하고, 조건을 만족하면 filter()에 True를 반환합니다.
마무리
파이썬의 filter() 함수는 사전에 정의한 조건에 따라 반복 가능한 객체를 걸러내고, 필터링된 결과를 반환하는 내장 함수입니다. 데이터 목록에서 특정 조건을 만족하는 값만 추출하고 싶을 때 매우 유용하게 사용됩니다.
이번 글에서는 filter()의 문법과 사용법을 알아보고, 재고 확인과 연령 필터링 예제를 통해 실제 동작 방식을 살펴봤습니다. 또한 람다 함수와 결합하면 불필요한 함수 정의 없이 코드를 더욱 간결하게 작성할 수 있다는 점도 확인했습니다.
이제 여러분도 filter()를 능숙하게 활용해 원하는 데이터만 손쉽게 추출할 준비가 되었습니다!