Python의 List Comprehension, filter, map, lambda의 사용법을 정리한다. (Python 3)
# 리스트 생성
elems = [1, 2, 3]
# list comprehension 사용
filtered = [elem for elem in elems if elem > 2]
print('List Comprehension: ' + str(filtered))
# 결과
List Comprehension: [3]
# 설명
[] 문법은 리스트 생성에 사용
집합과 원소를 표기할 때는 주로 elements, element 와 같은 식으로 네이밍한다.
따라서 위의 예제에서는 elems가 집합, elem이 원소를 의미한다.
[elem for elem in elems if elem > 2] -> elems 집합 중에서
[elem for elem in elems if elem > 2] -> 하나씩 꺼내 elem 원소에 넣고
[elem for elem in elems if elem > 2] -> 꺼낸 elem 원소가 조건을 만족하면
[elem for elem in elems if elem > 2] -> 조건을 만족한 elem 원소를 가지고
[elem for elem in elems if elem > 2] -> 리스트에 넣는다.
# filter 내장함수 사용
def above_two(n):
if n > 2:
return n
else: # 이하 구문은 없어도 함수를 빠져나갈 때 None이 리턴되지만, filter 함수가 참/거짓을 판단조건으로 한다는 점을 보이기 위해 일부러 넣었다.
return None
print('filter: ' + str(list(filter(above_two, elems))))
# 결과
filter: [3]
# 설명
def funcName(n): -> filter 함수에 끼워넣을 사용자 함수 생성 (filter가 작동하려면 사용자 함수는 참/거짓을 리턴해야 한다.)
...
filter(funcName, sequence) -> funcName은 이미 정의한 사용자 함수 명, sequence는 시퀀스 형 데이터를 넣는다.
filter(above_two, elems) -> elems 집합에서 원소를 하나씩 꺼내
filter(above_two, elems) -> above_two 함수에 넣는다. 이 함수에서는 처리를 한 결과를 리턴한다.
filter(above_two, elems) -> elems의 모든 원소에 대해서 above_two 함수에 던져 결과를 참인 원소만 모아 filter 객체를 생성한다.
list(filter(above_two, elems)) -> filter 객체를 리스트로 변환한다.
print('filter: ' + str(list(filter(above_two, elems)))) -> print 함수에서 스트링과 합치기 위해 다시 강제로 list 형을 string 형으로 변환한다.
# lambda와 filter 사용
print('filter w/ lambda: ' + str(list(filter(lambda n : n > 2, elems))))
filter w/ lambda: [3]
# 설명
filter(lambda n : n > 2, elems)) -> 람다 함수는 함수 이름이 없고 표현식만으로 이루어진 함수로 이 람다 함수를 누군가가 부를때 n에 값이 들어간다. 람다 함수 내부에서는 누군가가 던진 값을 : 뒤의 처리를 해서 리턴한다.
# map 내장함수 사용
def plus_one(n):
return n + 1
print('map func: ' + str(list(map(plus_one, elems))))
# 결과
map func: [2, 3, 4]
# 설명
map(plus_one, elems) -> elems 집합 내의 요소 하나씩 꺼내
map(plus_one, elems) -> plus_one 함수에 던져 반환된 값을 모아
map(plus_one, elems) -> map 객체를 만든다.
# lambda와 map 사용
print('map w/ lambda: ' + str(list(map(lambda n : n + 1, elems))))
map w/ lambda: [2, 3, 4]
# 설명
위의 모든 설명과 마찬가지로
map 내장 함수의 첫번째 인자로 들어가는 함수이름에 이름 없는 lambda 함수가 들어갔다.
# list comprehension, map, lambda 사용하기
filtered_with_map = map(lambda elem : elem + 1, [elem for elem in elems if elem % 2 == 0])
# 결과
[3, 5]
# 설명
먼저 map 내장 함수의 syntax를 살펴보자.
map(함수, 시퀸스 유형 데이터)
즉, lambda는 형태는 표현식이지만 함수 대용으로 쓰는 이름 없는 함수라고 했으므로 map() 내장 함수의 첫번째 인자로 줄 수 있다.
map(lambda elem : elem + 1,
다시 map 내장 함수의 두번째 인자를 생각해 보자.
여기는 시퀸스 유형의 데이터 라고 했으므로 앞서 list comprehension을 쓸 수 있다. 왜냐하면 결과로 리스트를 리턴하기 때문이다.
map(lambda elem : elem + 1, [elem for elem in elems if elem % 2 == 0])
결과적으로
1) map() 내장 함수의 두 번째 인자를 통해 집합을 만들고
2) 그 집합의 원소 하나 하나를
3) map() 내장 함수의 첫번째 인자의 함수에 넣어
4) 함수에서 리턴된 결과를 모아 map 객체를 만들어 반환한다.
라고 동작을 정리할 수 있다.
# dict comprehension
ds = dict(one=1, two=2, three=3)
ld = ['%s = %d' % (k, v) for k, v in ds.items() if v > 1]
print(ld)
# 결과
['three = 3', 'two = 2']
댓글 영역