티스토리 뷰

Python/Python

[Python]컴프리헨션(Comprehension)

Vagabund.Gni 2023. 4. 30. 13:04
728x90
반응형

목차

     

    컴프리헨션은 여러 가지 뜻이 있지만, 파이썬의 맥락에서는 '함축'이라는 단어가 가장 어울리는 것 같다.

     

    그 뜻대로 파이썬 컴프리헨션이란 리스트, 딕셔너리, 집합 등을 축약해서 만들어주는 기능이다.

     

    처음 접할 땐 '뭐 이렇게까지 해야 하나..' 싶지만 일단 익숙해지면 기존의 방식이 되려 거추장스럽다.

     

    시작하기 전에, 자바로 입문한 내게 있어 배열 선언과 요소 입력은 아래와 같은 방식이었다.

    arr = [0] * 5
    
    for i in range(5):
        arr[i] = input()
    
    print(arr)
    ['1', '2', '3', '4', '5']

    물론 작동은 잘한다.

     

    다만 파이썬에는 배열이 따로 없고 리스트가 존재하며, 자바의 배열과 달리 크기가 고정되는 타입이 아니다.

     

    그래서 아래와 같이 고쳐서 사용했다.

    lst = []
    
    for i in range(5):
        lst.append(input())
    
    print(lst)
    ['1', '2', '3', '4', '5']

    이 자체로도 충분히 잘 돌아가고 가독성 좋은 코드이지만, 컴프리헨션은 위와 같은 표현을,

     

    아니 위보다 더 복잡한 표현을 한 줄로 표현할 수 있도록 도와준다.

     

    계속해서 리스트, 딕셔너리, 집합의 생성에 컴프리헨션을 적용해 보자.

     

    List Comprehension

     

    단도직입적으로 위에 들어본 예를 컴프리헨션을 이용해 생성하면 아래와 같이 된다.

    lst = [num for num in range(1, 6)]
    
    print(lst)
    [1, 2, 3, 4, 5]

    코드 세 줄이 한 줄로 줄어들었다.

     

    그래서 뭐?

     

    하실 분을 위해 이어가자면, 컴프리헨션은 이보다 더 복잡한 작업을 한 번에 처리한다.

     

    예를 들어 1부터 10까지 정수 중에 짝수만 담은 리스트를 만든다고 하면 아래와 같이 처리하면 된다.

    lst = [num for num in range(1, 11) if num % 2 == 0]
    
    print(lst)
    [2, 4, 6, 8, 10]

    계속해서 그중에서 6보다 작거나 같은 수만 골라보자. 바로 이어서 적으면 된다.

    lst = [num for num in range(1, 11) if num % 2 == 0 if num <= 6]
    
    print(lst)
    [2, 4, 6]

    물론 2차원 이상의 리스트도 어렵지 않게 만들 수 있다.

     

    매우 직관적으로, 그냥 붙여서 쓰면 된다.

    lst = [(x, y) for x in range(1, 6) for y in range(1, 6)]
    
    print(lst)
    [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), 
    (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), 
    (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), 
    (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), 
    (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)]

    끝으로 조건문을 추가하면 아래와 같은 모양도 만들 수 있다.

    lst = [(x, y) for x in range(1, 6) for y in range(1, 6) if x <= 3 if y >= 3]
    
    print(lst)
    [(1, 3), (1, 4), (1, 5), 
    (2, 3), (2, 4), (2, 5), 
    (3, 3), (3, 4), (3, 5)]

     

    Dictionary Comprehension

     

    딕셔너리는 키:값 구조를 가진 독특한 자료형이다. 하지만 이 부분에만 좀 더 신경 쓰면

     

    컴프리헨션으로 생성하는 일 자체는 어려울 것이 조금도 없다.

     

    먼저 가장 기본적인 생성방법을 보자. 괄호의 모양이 리스트 시절과는 달라진 걸 놓치면 안 된다.

    dic = {num: num**2 for num in range(1, 6)}
    
    print(dic)
    {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

    주어진 범위에서 하나씩 꺼내와 키와 값을 만들어주는 것을 볼 수 있다.

     

    이를 비슷하게 응용하면 이미 만들어진 리스트에서 값을 가져와 생성하는 것도 가능하다.

    lst = [num for num in range(6, 11)]
    dic = {num: num**2 for num in lst}
    
    print(dic)
    {6: 36, 7: 49, 8: 64, 9: 81, 10: 100}

    다음은 두 개의 리스트를 이용해 딕셔너리를 생성하는 방식이다. zip() 함수가 유용하게 쓰인다.

    lst = [num for num in range(1, 6)]
    name = ['Gni', 'Dinger', 'Jinguk', 'Dodan', 'Bori']
    
    dic = {key: value for (key, value) in zip(lst, name)}
    
    print(dic)
    {1: 'Gni', 2: 'Dinger', 3: 'Jinguk', 4: 'Dodan', 5: 'Bori'}

    아주 당연하게도 조건문을 겹쳐 쓰는 것도 언제나 가능하다.

    lst = [num for num in range(1, 6)]
    name = ['Gni', 'Dinger', 'Jinguk', 'Dodan', 'Bori']
    
    dic = {key: value for (key, value) in zip(lst, name) if key <= 3}
    
    print(dic)
    {1: 'Gni', 2: 'Dinger', 3: 'Jinguk'}

     

    Set Comprehension

     

    집합 컴프리헨션은 중괄호를 쓴다는 점은 딕셔너리와 비슷하지만, 키-값 구조가 아니기 때문에

     

    컴프리헨션 생성 자체는 리스트와 크게 다를 것이 없다.

    num = {i for i in range(1, 6)}
    
    print(num)
    {1, 2, 3, 4, 5}

    다만 집합의 특성상 중복을 허용하지 않는다는 차이 정도.

    lst = {1, 1, 2, 2, 3, 3, 4, 4, 5, 5}
    num = {i for i in lst}
    
    print(num)
    {1, 2, 3, 4, 5}

    이렇게 해서 파이썬 컴프리헨션에 대해 대략적으로 알아보았다.

     

    (웹) 개발을 할 때 사용할 일이 많을까 의문은 들지만, 일단 알고리즘 풀 때는 도움이 되니까

     

    더 많이 사용해서 더 많이 익숙해지는 걸 목표로.

    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/05   »
    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
    글 보관함