ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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표현식을 지원


    댓글