프로그래밍에서 특정 객체의 필터링은 매우 중요한 작업 중 하나다. 필터링 관련 함수가 없다면 직접 반복문을 사용하여 하나하나 필터링을 하고 다시 객체로 반환하는 등 구현해줘야 한다. 파이썬에서는 filter() 함수가 그 역할을 담당하고 있다. 간단한 작업에서부터 복잡한 작업을 처리하는데 필터링을 해야 하는 경우는 상당한데, 이러한 내장 함수로 지원하기 때문에 손쉽게 구현할 수 있다.
그렇다면 파이썬에서의 filter() 함수는 어떠한 특징이 있는지 먼저 살펴보도록 하자.
필터링 ( filtering )
필터링이란, 어떤 기준에 따라 원하는 데이터만 선택하여 추출하는 것을 의미한다. 주어진 데이터 중에서 특정 조건을 만족하는 요소들을 선택하는 것이 필터링의 핵심이며, 이를 통해 데이터를 정제하고, 원하는 데이터에만 집중할 수 있다.
filter() 함수의 개념
filter() 함수는 주어진 조건 함수를 시퀀스의 각 요소에 적용하고, 조건 함수가 True를 반환하는 요소들로 이루어진 새로운 객체를 반환하게 된다. 기본적으로 filter() 함수를 통해서 필터링된 요소들은 원본 데이터의 시퀀스 순서를 유지하는 특징이 있다.
조건 함수
filter() 함수는 주어진 조건 함수를 시퀀스의 각 요소에 적용하고, 이 조건 함수는 True 또는 False를 반환한다.
시퀀스 순서 유지
필터링된 요소들은 원본 데이터의 시퀀스 순서를 유지한다.
리스트 생성
filter() 함수는 필터링된 요소들을 새로운 리스트로 반환한다.
함수 정의
필터링할 함수로는 람다 함수나 사용자가 직접 정의한 함수를 사용할 수 있으며, 이를 통해 간단한 조건부터 복잡한 조건까지 다양한 필터링이 가능하다.
결과 이터레이션
filter() 함수는 필터링된 요소들을 새로운 리스트를 생성하지 않고 이터레이터를 반환하므로 메모리를 효율적으로 사용할 수 있다.
제너레이터
filter() 함수는 결과를 즉시 사용하지 않고 나중에 필요할 때 사용할 수 있도록 제너레이터를 반환한다. 제너레이터는 필터링된 요소를 생성하는데, 이를 한 번에 모두 메모리에 저장하지 않고 필요할 때마다 값을 생성하여 메모리를 절약할 수 있다.
filter() 함수는 생각한것보다 메모리 효율성이 좋은 것 같다. 반복문 처리를 하면서 새로운 리스트를 생성하거나 작업을 처리하다 보니 방대한 양의 데이터를 필터링하게 된다면 반드시 고려해야 할 부분인데, 파이썬의 filter() 함수는 대용량 처리에서도 적절히 사용 가능할 것 같다.
filter() 함수의 활용
filter() 함수를 이용한 다양한 활용 사례들을 통해서 손쉽게 처리하는 것을 하나씩 살펴보자.
짝수 필터링
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)
# 출력: [2, 4, 6, 8, 10]
위의 코드는 숫자로 구성된 배열 객체에서 짝수만 필터링하는 예제 코드다. filter()함수의 인자값을 보면 첫 번째 인자로 필터 조건을 위한 람다 함수를 사용하고, 두 번째 인자로 배열 객체를 넘겨주고 있다.
람다 함수에서 각 요소마다 x % 2 == 0 조건식으로 짝수인지 필터링을 하고 있다.
위와 같이 처리를 한다면 짝수가 아닌 홀수, 양수, 음수 등 수의 유형별로도 필터링이 가능하다.
문자열 필터링
words = ["apple", "banana", "grape", "orange", "kiwi"]
long_words = list(filter(lambda x: len(x) >= 5, words))
print(long_words)
# 출력: ['banana', 'orange']
위의 코드는 문자열로 구성된 배열 객체에서 특정 조건에 의해 필터링하는 예제 코드다. 특정 조건은 각 요소의 문자 길이가 5 이상인 요소만 필터링하는 코드다. 이러한 방식을 통해 문자열에서 특정 조건마다 필터링하는데 유용하게 활용될 수 있다.
사용자 정의 함수 필터링
def is_even(num):
return num % 2 == 0
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(is_even, numbers))
print(even_numbers)
# 출력: [2, 4, 6, 8, 10]
위의 코드는 숫자로 구성된 배열에서 짝수만 추출하는 예제 코드인데, 람다 함수를 사용하는 대신 사용자 정의 함수를 사용하도록 하였다. 위의 코드와 같이 간단한 코드 조건식이라면 람다 함수를 사용하는 것이 가독성이 더 좋지만, 복잡한 조건식이 들어가는 경우에는 람다 함수 처리의 한계가 있을 수 있다. 이러한 경우에 위와 같이 함수를 직접 정의하여 처리하는 것이 좋다.
람다 함수를 사용하여 가독성있고 깔끔하게 처리한다면 좋겠지만, 실제 업무에서는 생각보다 복잡한 조건 처리식이 많기 때문에 두 방식을 모두 활용하는 것이 좋다.
딕셔너리 필터링
scores = {'Alice': 85, 'Bob': 70, 'Charlie': 90, 'David': 80}
filtered_scores = dict(filter(lambda item: item[1] >= 80, scores.items()))
print(filtered_scores)
# 출력: {'Alice': 85, 'Charlie': 90, 'David': 80}
일반 배열 형태의 객체가 아닌 위와 같은 딕셔너리 구조도 손쉽게 필터링이 가능하다. 람다 함수를 사용하여 처리하는 부분을 보게 되면, item[1] >= 80이라고 되어 있는데, 여기서 item[1]은 value에 해당하는 값이 되고, 따라서 값이 80이상 되는 요소만 필터링하는 코드다.
중복 제거 필터링
numbers = [1, 2, 3, 2, 4, 5, 3, 6, 7]
unique_numbers = list(filter(lambda x: numbers.count(x) == 1, numbers))
print(unique_numbers)
# 출력: [1, 4, 5, 6, 7]
filter() 함수를 이용한다면 위와 같이 중복되는 요소를 제거하고 배열 요소를 유니크하게 처리할 수 있다. 딕셔너리의 경우는 중복을 허용하지 않기 때문에 크게 상관없는데, 위와같이 일반 배열의 경우에서는 중복을 허용하기 때문에 상황에 따라 위와 같이 중복 제거 필터링이 필요하다.
이처럼 파이썬에서는 filter() 함수가 필요한 상황이 정말 많다. 이러한 만큼 함수의 특성을 잘 이해하고 활용하는 것이 중요하다.
filter() 함수의 성능
filter() 함수의 성능은 대상 데이터의 크기와 필터링하는 조건 함수의 복잡성에 따라 다를 수 있다. 단순하게 순환하며 요소를 걸러내는 것이 아니라 특정 조건이 얼마나 심플한지, 까다로운지에 따라 달라질 수 있고, 그 외에도 어떤 특징이 있는지 살펴보자.
데이터의 크기
filter() 함수는 대상이 되는 데이터 크기에 직접적으로 영향을 받는다. 그래서 데이터가 늘어날수록 처리 시간을 늘어날 수 있으므로 데이터의 양이 클 때에는 처리 시간을 항상 고려해야 한다.
복잡성
필터링에 사용되는 조건 함수의 처리되는 코드가 복잡할수록 filter() 함수의 성능이 저하될 수 있다. 예를 들어, 조건 함수 내에서 루프나 다른 연산을 많이 포함하게 되면 필터링하는 시간이 늘어날 수 있다.
데이터 형태
필터링의 대상이 되는 데이터의 유형에 따라서도 성능에 문제가 될 수 있다. 리스트, 딕셔너리, 튜플 등 다양한 형태를 다루지만 각각의 형태에 따라서 걸리는 시간이 다르므로 필터 대상의 데이터 형태가 무엇인지 확인하고 처리하는 것이 중요하다.
메모리 효율성
filter() 함수는 필터링된 결과를 새로운 리스트로 생성하지 않고 이터레이터로 반환한다. 이는 필터링된 결과를 메모리에 한꺼번에 저장하지 않고, 필요할 때에만 요소를 생성하여 메모리를 효율적으로 사용한다. 따라서 대상 데이터의 크기에 상관없이 일관된 메모리 사용량을 유지할 수 있다.
파이썬에서 filter() 함수는 메모리를 효율적으로 사용하는 것에 비해 처리 시간이 오래 걸릴 수 있다는 것을 확인할 수 있다. 그래서 filter() 함수를 사용하게 되는 경우에는 필터 조건 함수가 너무 복잡하진 않은지, 데이터의 양이 얼마나 되는지 파악하고 문제가 된다면 다른 방법을 찾아 처리하는 것도 방법이라고 생각한다.
마무리
파이썬의 filter() 함수는 기능이 간단하고 다루기 쉬운 만큼 기능의 특성을 잘 파악하고 사용하는 것이 중요하다. 대상 객체의 요소 건수가 많은 만큼 조건 처리하는 함수가 너무 복잡하지 않도록 코드를 작성하는 것이 좋다.
* 경제 지표 서비스
Economy Flow
econoflow.co.kr
'Python' 카테고리의 다른 글
파이썬 객체를 탐색하는 dir() 함수의 개념과 활용! (0) | 2024.05.21 |
---|---|
파이썬 정렬 함수 sorted()에 대한 개념과 활용! (0) | 2024.05.20 |
파이썬 튜플 tuple 객체에 대한 개념과 특징 (0) | 2024.05.17 |
파이썬 enumerate() 함수의 개념과 활용! (0) | 2024.05.16 |
파이썬 리스트 컴프리헨션의 개념과 특징을 살펴보기! (0) | 2024.05.15 |