ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] Tip - list comprehension에서 표현식은 2개까지만
    언어/파이썬 & 장고 2016. 10. 9. 17:14

    list comprehension은 다중 루프도 지원합니다. 예를 들어 2차원 행렬을 모든 셀이 포함된 평평한 리스트 하나로 간략화한다고 가정하면 다음 for 표현식 두 개를 사용해 표현할 수 있습니다.

    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    flat = [x for row in matrix for x in row]
    print(flat)
    # 결과
    # [1, 2, 3, 4, 5, 6, 7, 8, 9]


    또 다른 사용법으로는 2차원 행렬의 각 셀에 있는 값의 제곱을 구한다는 가정합니다. 추가로 [] 문자를 사용하기 때문에 좋아보이진 않지만 이해하기는 쉽습니다.

    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    squares = [[x**2 for x in row] for row in matrix]
    print(squares)
    # 결과
    # [[1, 4, 9], [16, 25, 36], [49, 64, 81]]

    위의 표현식을 다른 루프에 넣는다면 list comprehension이 여러줄로 구분해야 할 정도로 길어집니다.

    my_lists = [
        [[1, 2, 3], [4, 5, 6]],
        # ...
    ]
    flat = [x for sublist1 in my_lists
            for sublist2 in sublist1
            for x in sublist2]


    이번엔 list comprehension이 아닌 일반 루프문으로 표현해보겠습니다. 일반 루프문은 탭으로 구분되어 있어 쉽게 읽을 수 있습니다.

    flat = []
    for sublist1 in my_list:
        for sublist2 in sublist1:
            flat.extend(sublist2)


    list comprehension도 다중 if조건을 지원합니다. 같은 루프 레벨에 여러 조건이 있으면 암시적인 and 표현식이 됩니다. 예를 들어, 숫자로 구성된 리스트에서 4보다 큰 짝수 값만 가지고 오는 예제는 아래처럼 표현할 수 있습니다.

    a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    b = [x for x in a if x > 4 if x % 2 == 0]
    c = [x for x in a if x > 4 and x % 2 == 0]
    # b와 c 결과 동일


    조건은 루프의 각 레벨에서 for 표현식 뒤에 설정할 수 있습니다. 예를 들어 행렬에서 로우의 합이 10이상이고 3으로 나누어 떨어지는 셀을 구한다는 예제입니다. list comprehension으로 표현하면 간단하지만 이해하기가 어렵습니다.

    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    filtered = [[x for x in row if x % 3 == 0] for row in matrix if sum(row) >= 10]
    print(filtered)
    # 결과
    # [[6], [9]]


    위와 같이 몇 줄을 절약하기 위해 사용한 list comprehension은 다른 사람들이 이해하기가 어려울 수 있다는 단점이 있습니다.

    list comprehension을 사용할 땐 표현식이 두 개를 넘지 않는 것이 좋으며 만약 복잡해 질 것 같으면 헬퍼 함수를 작성해야 한다.

    요약

    list comprehension은 다중 루프와 루프 레벨별 다중 조건을 지원

    표현식이 두개가 넘게 들어 있는 list comprehension은 이해가 어렵기 때문에 피하는 것을 지향


    댓글