티스토리 뷰

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']




댓글
댓글쓰기 폼
공지사항
Total
410,768
Today
37
Yesterday
44
«   2019/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
글 보관함