<개인공부>/[Python]

[python] 파이썬 filter 함수 사용법과 예제

BlockDMask 2021. 5. 31. 00:30
반응형

안녕하세요. BlockDMask입니다.
오늘은 파이썬에서 유용하게 사용하는 함수인 filter 함수에 대해서 알아보려고 합니다.

<목차>
1. 파이썬 filter 함수 설명
2. 파이썬 filter 함수 예제

 

 

1. filter 함수 설명과 간단 사용법


1-1) filter 함수 기본 설명

필터 함수는 이전 시간에 배웠던 map함수와 동일한 구조로 작동하게 되어있습니다.
map이 iterator 모든 값에 어떤 짓(?)을 한다고 하면
filter는 iterator 값들 중에 입맛에 맞는 값들만 쭉쭉 빼서 리스트를 만든다고 생각하면 됩니다.

filter(function, iterator)

첫 번째 매개변수로는 필터링을 적용시킬 함수가 오고
두 번째 매개변수로는 반복 가능한 값들이 들어오게 됩니다.

filter 함수는 iterator에 들어온 값들을 하나하나 function에 넣어서 반환이 true값을 필터링해서 다시 리스트로 만들어주는 그런 함수입니다.

예를 들면 1~10까지 리스트가 있는데 그중 2로 나누어 떨어지는 값들만 뽑아서 리스트를 다시 만들고 싶을 때
사용하면 됩니다.

이런 식으로 사용이 되겠죠? filter( 2로 나누었을때 0이 되면 리턴 true, [1 ~ 10] ) 이런식으로 사용하면 되는 함수입니다.

쉽게 말하면 두 번째 인자로 들어온 리스트를 첫 번째 인자로 들어온 함수에 맞게 리스트를 거르는 함수입니다.

주의할 점은 filter의 반환 값이 filter 객체 이기 때문에 리스트로 형 변환해주어야 합니다. 
list(filter(함수, 리스트)) 이런 식으로 해주어야 합니다.

 

1-2) filter 함수를 사용했을 때와 그렇지 않을 때 비교

def is_even(x):
    if x % 2 == 0:
        return True
    return False

# for 반복문 이용
arr1 = []
for val in range(1, 11): # 1~10 까지
    if is_even(val):
        arr1.append(val)
    
print(f"arr function : {arr1}")




# filter 함수 이용
arr2 = list(filter(is_even, range(1,11)))
print(f'arr filter : {arr2}')

2로 나누었을 때 2로 나누어 떨어지는 숫자인 경우 True를 반환하고 그렇지 않으면 False를 반환하는 짝수를 감별하는 함수 is_even(x)를 만들고

for 반복문과 filter 함수를 이용해서 각각 짝수를 구하는 것을 작성해 보았습니다.
filter가 더 간편해 보이지 않나요?

이런 식으로 filter 함수를 이용할 수 있습니다.
아래 더 많은 에제를 보시죠

 

 

2. filter 함수 예제들


2-1) filter 함수와 일반 함수

arr = [1, 10.2, 100.3, 2.3, 20.2, 200.3, 3, 30, 300]

# 10보다 작은 수 True
def func1(n):
    if n < 10: 
        return True
    return False

# 정수일때는 True 반환
def func2(n):
    if isinstance(n , int):
        return True
    return False

# 실수일때 True 반환
def func3(n):
    return isinstance(n , float)


result1 = list(filter(func1 ,arr))
result2 = list(filter(func2 ,arr))
result3 = list(filter(func3 ,arr))

print(f'원래 리스트 : {arr}')
print(f'10보다 작은 수 : {result1}')
print(f'정수만 출력 {result2}')
print(f'실수만 출력 {result3}')

func1 은 10 미만의 숫자가 들어오면 True를 반환하는 함수입니다.
filter 함수를 거친 후에 원래 리스트에서 10 미만의 숫자인 1, 2.3, 3이 리스트로 새롭게 만들어진 것을 볼 수 있습니다.

func2, func3에서 사용한 isinstance 함수첫 번째 인자랑 두 번째 인자랑 같은 타입인지 확인하는 함수입니다.
이 함수를 이용해서 func2는 값이 int 타입이면 True를 반환하고, func3 은 값이 float 타입이면 True를 반환하도록 작성했습니다.

그 결과 filter 함수를 각각 거치게 되니 func2는 정수만 출력해서 리스트를 만들어어주었고,
filter 함수 + func3은 실수만 출력하게 되었습니다. 

 

 

2-2) filter 함수와 람다 함수

filter 함수의 첫 번째 매개변수에 함수가 들어오는데, 간단한 함수 거나 한 번만 사용하는 일회성 함수인 경우 따로 def를 이용해서 함수를 만들기보다는 lambda 함수를 이용해서 함수를 만드는 것이 좀 더 편리할 수 있습니다.

arr = [1, 10.2, 100.3, 2.3, 20.2, 200.3, 3, 30, 300]

result1 = list(filter(lambda n : n < 10 ,arr))
result2 = list(filter(lambda n : isinstance(n , int) ,arr))
result3 = list(filter(lambda n : isinstance(n, float), arr))

print(f'원래 리스트 : {arr}')
print(f'10보다 작은 수 : {result1}')
print(f'정수만 출력 {result2}')
print(f'실수만 출력 {result3}')

예제 2-1과 동일한 동작을 하는 함수를 람다 함수를 이용해서 만들었습니다.
결과를 보면, 동일한 것을 볼 수 있습니다.
def를 이용한 것보다 lambda를 이용하니 코드가 훨씬 간결하고 짧아진 것을 볼 수 있습니다.

lambda 함수에 대한 설명이 궁금하다면 [바로가기]

 

이렇게 파이썬 filter 함수에 대해서 알아보았습니다.
이 필터 함수는 잘만 사용하면 매우 유용하게 사용할 수 있으니 잘 알아두시면 좋을 것 같습니다.
감사합니다.

반응형