[파이썬] 내장함수 filter 사용하기

InAnarchy·2023년 4월 16일
0

Python

목록 보기
11/14
post-thumbnail

filter

  • 거르는 기준이 되는 함수, 걸러질 리스트(Iterable)을 매개변수로 받음
  • 결과가 True일 경우에만 필터링.
  • 필터의 결과 데이터 타입은 filter 타입이기 때문에, list/tuple 등의 타입으로 변환해야 함.
  • 큰 리스트가 있을 때 메모리를 절약하기 위해 사용
  • lambda, map과 자주 쓰임.
filter(함수, 반복 대상)
  1. 예시를 보자. 3의 배수를 출력하는 코드이다.
def func(num):
  return num % 3 == 0

mul_3 = filter(func, range(20))

for i in mul_3:
  print(i, end = " ") #0 3 6 9 12 15 18 

filter(함수, 반복대상)에서
대상이 3의 배수인지 True/False로 구분해서
True인 경우에만 출력한다.

똑같은 기능으로

mul_3 = [x for x in range(20) if func(x)]

를 사용해도 된다.

  1. 다른 예시를 보자. 소수를 판별하는 코드이다.
def is_prime(num):
  if num <=1:
    return False 
  for i in range(2, int(num ** (1/2)) + 1):
    if num % i == 0:
      return False
  return True

nums = [i+1 for i in range(30)]
primes = []
for i in nums:
  if is_prime(i):
    primes.append(i)
print(primes) #[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

이 때 filter를 이용해서 코드를 줄여보자.

primes = []
for i in nums:
  if is_prime(i):
    primes.append(i)

의 코드를 한줄로 줄일 수 있다.

primes = list(filter(is_prime,nums))

사실 필터를 사용하지 않아도 되긴한다...

primes = [i for i in nums if is_prime(i)]

필터보다 list comprehension을 사용하는 게 더 파이썬스러운 (Pythonic code) 코드이다.

  1. 또 다른 예시를 보자. 짝수를 판별하는 코드이다.
nums = [1,2,3,4,5,6,7,8,9,10]
result = [] 

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

for value in nums:
  if is_even(value):
    result.append(value)
print(result)

이 코드를 계속 줄여보자.

리스트 컴프리헨션을 사용해서 이렇게 줄일 수 있다.

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

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

result = [value for value in nums if is_even(value)]
print(result) 

그런데 필터를 사용하면 이렇게 표현할 수 있다.

nums = [1,2,3,4,5,6,7,8,9,10]
result = [] 

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

result = filter(is_even, nums)

print(list(result))

필터와 람다를 같이 사용해서 더 줄일 수도 있을 것 같다.

nums = [1,2,3,4,5,6,7,8,9,10]

result = filter(lambda x : x%2==0, nums)
print(list(result))

사실 필터와 람다 둘 다 안써도 되긴 한다

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

result = [value for value in nums if value % 2 == 0]
print(result)  # 출력: [2, 4, 6, 8, 10]

Note that filter(function, iterable) is equivalent to the generator expression (item for item in iterable if function(item)) if function is not None and (item for item in iterable if item) if function is None.
출처: 파이썬 공식문서

filter(function, iterable) 은
item for item in iterable if function(item)과 같은 의미이니
건방지게 필터 쓰지말자

REFERENCE
PYTHON DOCS
코딩빌런 유튜브

profile
github blog 쓰다가 관리하기 귀찮아서 돌아왔다

0개의 댓글