-
[Python] Tip - map과 filter 대신 list comprehension을 사용언어/파이썬 & 장고 2016. 10. 9. 16:53
파이썬에서는 한리스트에서 다른 리스트를 만들어내는 간결한 문법을 list comprehension이라 합니다.
예를 들어 리스트에 있는 각 숫자의 제곱을 계산한다고 할 때 아래와 같이 코딩할 수 있습니다.
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] squares = [x**2 for x in a] print(squares) # 결과 # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
간단한 연산에는 list comprehension이 내장 함수 map보다 명확합니다. map을 쓰려면 계산에 필요한 lambda 함수를 생성해야 해서 깔끔해 보이지 않습니다.
squares = map(lambda x:x**2, a)
map과 달리 list comprehension을 사용하면 리스트에 있는 아이템을 간편하게 걸러낼 수 있습니다.
even_squares = [x**2 for x in a if x % 2 == 0] print(even_squares) # 결과 # [4, 16, 36, 64, 100]
내장함수 filter를 map과 연계해서 사용해도 같은 결과를 얻을 순 있지만 가독성이 떨어집니다.
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] even_squares = [x**2 for x in a if x % 2 == 0] alt = map(lambda x: x**2, filter(lambda x: x % 2 == 0, a)) assert even_squares == list(alt) # 같은 결과를 확인
딕셔너리와 세트에도 list comprehension에 해당하는 문법이 있습니다. comprehension문법을 쓰면 알고리즘을 작성할 때 파생되는 자료 구조를 쉽게 생성할 수 있습니다.
chile_ranks = {'ghost': 1, 'habanero': 2, 'cayenne': 3} rank_dict = {rank: name for name, rank in chile_ranks.items()} chile_len_set = {len(name) for name in rank_dict.values()} print(rank_dict) print(chile_len_set) # 결과 # {1: 'ghost', 2: 'habanero', 3: 'cayenne'} # set([8, 5, 7])
요약
list comprehension은 추가적인 lambda가 필요없어서 map이나 filter보다 명확하고 간결함
딕셔너리와 세트에도 comprehension표현식을 지원