python

[python] lambda/map/filter

천뿌니 2022. 4. 3. 03:37
728x90

1. lambda

lambda parameters : expression

런타임에 생성해서 사용할 수 있는 익명 함수이다. 

필자는 sorted에서 key 값으로 자주 사용하는데, 한 줄로 구현되는 간단한 함수에도 사용하면 편리할 거 같다.

사용법에 익숙해지자

# 인덱스 1의 데이터로 내림차순 정렬
result = sorted(result, key = lambda x : x[1], reverse = True)

# 제곱 기능을 하는 lambda 함수 square
square = lambda x : x * x

# string이 빈 문자열일 경우 빈 문자열을, 아니면 첫 번째 글자를 리턴 함수
first_letter = lambda string : string[0] if string else ''

2. map

map(function, iterable, ...) : " Return an iterator that applies function to every item of iterable "

iterable 한 모든 item에 함수를 적용하는데 iterator를 반환한다. 

예를 들면 <map object at 0x7f717501b2b0> 이렇게 map object가 나오는데 list로 감싸주면 iterable 한 결과를 얻을 수 있다.

js에서 처음 배웠던 개념인데, python에서는 없는 줄 알았는 데 있어서 놀랬다.

for문의 업그레이드 버전 느낌이다. 

 

# csv파일에서 책 제목을 얻는 함수 
import csv

def get_titles(books_csv):
    with open(books_csv) as books:
        reader = csv.reader(books, delimiter=',')
     	# lambda를 사용하여 title 속성인 row[0]을 뽑아내는 익명함수 정의
        get_title = lambda row: row[0]
        # reader라는 책 데이터에서 title 익명함수를 map을 사용하여 적용
        # 결과인 titles에는 책 제목이 있는 map object 반환
        titles = map(get_title, reader)
        
        # 리스트로 감싸주면 책 제목 결과 반환
        return list(titles)

3. filter

map(function, iterable,...) : " Construct an iterator from those elements of iterable for which function returns true "

특정 함수에 ture인 iterable 한 모든 item으로부터 iterator를 구성한다.

map과 유사한데, 기존 map에서 조건식을 추가한 것이다.

for문(반복문)과 if문(조건식)을 섞인 느낌이다. lambda 식과 자주 사용된다.

 

# 위 map의 예시와 같고, filter를 추가하여 책 페이지 수 250 초과인 책의 제목을 얻는 함수이다.
import csv

def get_titles_of_long_books(books_csv):
    with open(books_csv) as books:
        reader = csv.reader(books, delimiter=',')
        # lambda를 사용하여 250 초과 페이지 함수 작성
        is_long = lambda row: int(row[3]) > 250
        # 책 제목 추출하는 함수 작성
        get_title = lambda row: row[0]
        
        # reader 책 데이터에서 is_long인 페이지 수가 250 초과인 데이터만 뽑아서 long_books에 저장
        long_books = filter(is_long, reader)
        # 페이지 수가 250 초과인 데이터에서 책 제목만 추출해서 저장하면 map object 형태
        long_book_titles = map(get_title, long_books)
        
        # list로 감싸주면 원하는 결과 추출 가능
        return list(long_book_titles)

익명 함수를 변수에 저장해서 넣어줘도 되고, filter나 map안에 lambda로 넣어줘도 됨

그럴 때는 list로 감싸줘야 원하는 결과 얻을 수 있다. 아니면 map onject만 반환

result = list(filter(lambda x : x[1] >= n, title_view))
result = sorted(result, key = lambda x : x[1], reverse=True)

 

* 평소 python을 사용할 때는 거의 사용하지 않은 개념들이라(for, if.. 만 사용) 익숙해지면 코드 가독성이 높아져서 클린 코드 작성에 용이할 거 같다.