ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 리스트 컴프리헨션(List Comprehension)을 이해한다는 것
    IT 2026. 1. 21. 15:49

     

    파이썬을 배우다 보면 어느 순간 이런 코드를 마주하게 됩니다.

    squares = [x * x for x in range(10)]

    처음에는 신기하고, 익숙해지면 편리하지만, 막상 누군가가 "리스트 컴프리헨션이 뭐야?"라고 물으면 명확하게 설명하기가 쉽지 않습니다.

    어떤 사람에게는 단순한 축약 문법처럼 느껴지고, 또 어떤 사람에게는 읽기 어려운 코드처럼 보이기도 합니다.

     

    이 글에서는 리스트 컴프리헨션을 설명합니다.

     

    우리는 왜 for 문으로 리스트를 만들까?

    리스트 컴프리헨션을 이해하려면, 먼저 우리가 평소에 리스트를 어떻게 만드는지부터 떠올려보는 것이 좋습니다.

    result = []
        for x in range(10):
            result.append(x * x)

    이 코드는 너무나 익숙하고, 전혀 문제가 없어 보입니다. 하지만 이 코드에는 사실 두 가지 일이 동시에 섞여 있습니다.

     

    첫째는 "10까지 반복한다"는 반복의 흐름이고, 둘째는 "값을 가공해서 리스트에 담는다"는 의도 입니다. 이 두 가지가 한 덩어리로 엮어 있기 때문에, 코드가 길어지고 핵심이 흐려지고도 합니다.

     

    리스트 컴프리헨션은 바로 이 지점에서 출발합니다.

    "반복 구조는 숨기고, 무엇을 만드록 싶은지만 드러낼 수 없을까?"

     

     

    리스트 컴프리헨션은 의도를 드러내는 문법이다

    위의 for 문 코드를 리스트 컴프리헨션으로 바꾸면 이렇게 됩니다.

    result = [x * x for x in range(10)]

    이 코드를 말로 읽어보면 "0부터 9까지의 x에 대해 x의 제곱으로 이루어진 리스트"라고 자연스럽게 해석할 수 있습니다. 즉, 어떻게 반복하는지보다 무엇으로 이루어진 리스트인지가 더 먼저 눈에 들어옵니다.

    이 점에서 리스트 컴프리헨션은 단순히 축약이 아니라, 선언형 표현에 가까운 문법이라고 볼 수 있습니다.

     

    조건이 들어가면 더 분명해진다

    리스트 만들 때는, 모든 값을 다 담고 싶지 않은 경우도 많습니다. 예를 들어 짝수만 골라서 제곱하고 싶다면, 기존 방식은 이렇게 작성했을 것 입니다.

    result = []
        for x in range(10):
            if x % 2 == 0:
                result.append(x * x)

    리스트 컴프리헨션으로 바꾸면 다음과 같습니다.

    result = [x * x for x in range(10) if x % 2 == 0]

    여기서 중요한 점은, 조건문이 뒤로 밀려나 있다는 것입니다. 이는 "무엇을 만들 것인가"가 여전히 앞에 있고, 조건은 그 대상을 제한하는 역할만 한다는 인상을 줍니다.

     

    읽기 쉬운가, 어려운가?

    리스트 컴프리헨션에 대해 자주 나오는 논쟁 중 하나는 가독성입니다. 어떤 사람은 한 줄로 끝나는 코드가 깔끔하다고 느끼고, 어떤 사람은 for 문이 더 명확하다고 느낍니다.

    여기서 중요한 기준은 줄 수 가 아니라 한 눈에 이해할 수 있는가입니다.

    result = [process(x) for x in data if is_valid(x) and x > 0]

    이 정도까지는 대부분의 사람이 무리 없이 읽을 수 있습니다. 하지만 조건이 여러 개 겹치거나, 표현식이 지나치게 길어지면 오히려 이해하기 어려워질 수 있습니다.

    리스트 컴프리헨션은 “짧을 때 가장 아름답다”는 점을 기억하는 것이 중요합니다.

     

    중첩된 리스트 컴프리헨션은 신중하게

    리스트 컴프리헨션은 중첩해서 사용할 수도 있습니다.

    pairs = [(x, y) for x in range(3) for y in range(3)]

     

    이 코드는 문법적으로는 문제가 없지만, 익숙하지 않은 사람에게는 한 번에 이해되기 어렵습니다. 이런 경우에는 차라리 for 문을 사용하는 것이 더 친절할 수 있습니다.

    리스트 컴프리헨션은 코드를 똑똑하게 보이게 만드는 도구가 아니라, 의도를 명확하게 만드는 도구라는 점을 잊지 않는 것이 좋습니다.

     

    제너레이터와의 연결점

    앞에서 제너레이터를 다뤘다면, 리스트 컴프리헨션과의 관계도 자연스럽게 떠올릴 수 있습니다.

    squares = (x * x for x in range(10))

    대괄호 대신 소괄호를 사용하면, 리스트가 아니라 제너레이터가 만들어집니다. 이 차이는 “모든 값을 지금 당장 저장할 것인가, 필요할 때 하나씩 만들 것인가”라는 선택의 차이입니다.

    즉, 리스트 컴프리헨션과 제너레이터 표현식은 같은 문법적 사고에서 출발했지만, 서로 다른 사용 목적을 가지고 있습니다.

     

    리스트 컴프리헨션을 이해하는 핵심 질문

    리스트 컴프리헨션을 잘 쓰고 있는지를 판단하는 가장 좋은 질문은 이것입니다.

    "이 한 줄의 코드를 말로 설명할 수 있는가?"

    자연스럽게 문장으로 설명할 수 있다면, 그 리스트 컴프리헨션은 대부분 좋은 코드입니다. 반대로 설명하기 어렵다면, 그 코드는 이미 너무 많은 일을 하고 있을 가능성이 큽니다.

     

    마무리하며

    리스트 컴프리헨션은 파이썬을 파이썬답게 만들어주는 문법 중 하나입니다. 하지만 모든 상황에서 사용해야 하는 만능 도구는 아닙니다.

    중요한 것은 짧은 코드가 아니라, 의도가 잘 드러나는 코드입니다. 리스트 컴프리헨션은 그 의도를 가장 잘 드러낼 수 있을 때 사용하면 됩니다.

    결국 이 문법을 이해한다는 것은, 이런 질문에 답할 수 있다는 뜻입니다.

    "나는 지금 어떤 리스트를 만들고 싶은가?"

    그 질문이 명확하다면, 리스트 컴프리헨션은 아주 자연스럽게 따라올 것입니다.

     

    여기까지 입니다.

    감사합니다.

Designed by Tistory.