본문 바로가기

Program Languages/Python

파이썬 filter,map 사용법

이번 포스트에서는 filter함수와 map함수에 대해서 알아보겠습니다.


filter, map함수의 이해

filter함수

어떤 iterable한 인스턴스에 대해 각 iteration원소가 function이라는 조건을 참으로 반환하는 원소만 다시 수집한 결과를 반환한다.

매개변수 설명 예제
function 어떤 iterable과 iterables 매개변수를 사용해 각 iteration에 대해 function을 적용한다. 
결과 값은 불리언과 연관된 값이 반환되어야 한다.
result_element = function(next element of 'iterable')

function매개변수 인자 인스턴스는 callable해야 한다.
function = lambda x : x%2

flt = filter(function,range(10))

#flt is [1,3,5,7,9]
iterable iterable한 객체 인스턴스.

 

map함수

어떤 iterable한 인스턴스들에 대해 function을 적용한 값들을 반환한다

매개변수 설명
function 어떤 iterable과 iterables 매개변수를 사용해 각 iteration에 대해 function을 적용한다.
function매개변수 인자 인스턴스는 callable해야 한다.

result_element = function(iterable,*iterables)
iterable iterable한 객체 인스턴스.

(최소 1개 이상의 iterable한 객체가 매개 변수 인자로 들어와야 해서 *iterables와 따로 분리)
iterables* 추가적인 iterable한 객체 인스턴스들.

function(iterable,iterables[0],iterables[1],...) 같이 function에 들어갈 추가적인 가변 매개변수 인자를 담고 있다.

 

코드 예제

#filter function example
rng = range(10)
filtered_rng = filter(lambda x: x%2,rng)
print("*"*3,"filter함수 예제","*"*3)
print("  원래 값들:",*rng)
print("  원래 값들의 홀수값들:",*filtered_rng)
print("\n"*3)





#map function examples
print("*"*3,"map함수 예제","*"*3)
rng1 = range(10)
rng2 = range(50,100)
rng3 = range(200,300)
print(" rng1 요소갯수:",len(rng1))
print(" rng2 요소갯수:",len(rng2))
print(" rng3 요소갯수:",len(rng3))
print(" min(len(rng1) ,len(rng2) ,len(rng3)):",min(len(rng1) ,len(rng2) ,len(rng3)))
print()

#map function example1
values = map(float,rng)
print("  범위 값들을 실수형으로 변환된 값들:",*values)
print()

#map function example2
values = map(lambda x: 2*x if(x%3) else x,rng)
print("  값이 이전에 3의 배수라면 그대로 가져오고 아니라면 해당값의 2배된 값을 출력하는 에제")
print("   값들:",*values)
print()

#map function example3
from timeit import timeit
values = list(map(lambda *x: sum(x),rng1,rng2,rng3))
print("  각 iterables 인스턴스들의 행값들을 더해서 반환해주는 예제")
print("   iteration걸린 시간:",timeit(lambda: list(map(lambda *x: sum(x),rng1,rng2,rng3)),number=1000))
print("     같은결과 zip함수를 사용한 iteration걸린시간:",timeit(lambda: list(map(sum, zip(rng1,rng2,rng3))),number=1000))
print("   값들:",*values)
print("   values 변수 요소 길이:",len(values))
print("     각 행들을 더 한 값과 같은 값? ",all(map(lambda x1,x2: x1==x2,values,map(sum, zip(rng1,rng2,rng3)))))
print()

 

추가 사항

filter함수

  • function함수의 결과값의 데이터 타입이 항상 정확히 불리언일 필요는 없고, 불리언 값으로 해석될 수 있는 값이면 된다.(e.g. 0,1)
  • 'function' 매개변수 인자는 None 값이 들어와도 된다.(이 경우, 값이 0 이 아니거나 null instance(혹은 None) 가 아니면 참을 반환)

map함수

  • map함수의 요소 갯수는 min([len(iterable),*map(len,iterables)])이다.
    즉, 각 iterables 매개변수 인스턴스의 가장 적은 원소의 갯수가 함수 결과의 요소 갯수가 된다.
  • iterable매개변수와 *iterables는 사실상 *zip(iterable,*iterables) 값이 funcation함수의 매개변수 인자로 들어가는 것과 유사하다.
 

파이썬 enumerate, zip 함수 사용법

파이썬의 enumerate,zip 라는 어원에서 알 수 있듯이, enumerate 함수는 Iterator를 하나하나 열거(수를 세면서)하면서 각 원소들을 탐색하는 함수 zip함수는 여러 Iterator의 각 Iterator의 행(Row)들을 열(Column)

codevex.tistory.com

  • itertools라는 기본 라이브러리를 사용하면 확장된 탐색,적용이 가능하다