파이썬 map, filter, lambda
아래와 같은 딕셔너리가 있다고 해보자.
people = [
{'name': 'bob', 'age': 20},
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27},
{'name': 'bobby', 'age': 57},
{'name': 'red', 'age': 32},
{'name': 'queen', 'age': 25}
]
if문을 활용해서 'age'에 따라 '성인' 인지, '청소년'인지 판별하는 함수를 만들었다.
def check_adult(person):
if person['age'] >20:
return '성인'
else:
return '청소년'
딕셔너리 각 요소를 돌면서 판별값을 추출한 결과를 받아오고자 할 때,
함수를 각각 요소에 적용해야 하기 때문에 이때 'map'을 사용한다.
1. map
- map(함수, 대상)
: 대상 자료를 하나하나 돌면서 함수에 넣는다.
result = map(check_adult, people)
print(list(result))
>>> ['청소년', '성인', '청소년', '청소년', '성인', '성인', '성인', '성인']
각 결과값을 리스트에 담아 표현하기 위해 list(result)를 출력한다.
2. lambda로 식 간소화
우선 위 함수를 삼항연산자를 활용하면 위의 if문은 아래와 같이 정리 가능하다.
def check_adult(person):
return '성인' if person['age'] > 20 else '청소년'
함수를 굳이 만들지 않고 식을 사용하기 위해서 lambda식을 사용한다.
result = map(lambda x :('성인' if x['age'] > 20 else '청소년') , people)
위 식을 감싸고 있는 것은 map함수이다. people을 돌면서 괄호 안의 함수를 적용한다.
위 식이 복잡해보일 수 있으니 lambda식만 밖으로 빼보면 아래와 같다.
lambda x :('성인' if x['age'] > 20 else '청소년')
lambda식은 매개변수(x)와 식으로 구성한다.
# lambda 매개변수1, 매개변수2, ... : 매개변수를 사용한 표현식
lambda x: x + 10
# 아래 식과 동일(함수를 만들지 않음)
def plus_ten(x):
return x + 10
위 표현을 보면 알 수 있듯이, 보통 함수를 한 줄로 간결하게 만들 때 사용한다.
또는 함수를 만들지 않고 사용해도 될 정도로 복잡하지 않거나 def를 사용하지 못할 경우 대체한다.
3. filter
: filter는 map과 유사하게 사용가능하나 true만 추출한다.
위 딕셔너리에서 'age'가 20보다 큰 요소만 뽑아온다고 하였을 때 아래와 같이 추출할 수 있다.
result = filter(lambda x:x['age']>20, people)
>>> [{'name': 'carry', 'age': 38}, {'name': 'ben', 'age': 27}, {'name': 'bobby', 'age': 57}, {'name': 'red', 'age': 32}, {'name': 'queen', 'age': 25}]
반응형
'DEV > 파이썬 이론' 카테고리의 다른 글
파이썬 코딩 :: 파이썬 모듈(Module), 파이썬 스탠다드 라이브러리 (0) | 2022.09.02 |
---|---|
파이썬 코딩 :: 파이썬 클래스(class) (0) | 2022.09.02 |
파이썬 코딩 :: 파이썬 문법, 알고리즘_TIL#04 (0) | 2022.09.01 |
파이썬 코딩 :: 파이썬 try, except, finally, raise_예외처리 (0) | 2022.09.01 |
파이썬 코딩 :: 파이썬 튜플(tuple), 집합 (0) | 2022.09.01 |
댓글