[Python] 리스트 내포 / 이중 리스트 내포 with IF문

파이썬에서는 For 문과 If 문을 한 라인에 작성하여 코드를 직관적으로 만들고, 실행 속도도 높여주는 방법이 있습니다.

리스트 내포(List comprehension)이라는 기법인데요, 그 문법은 다음과 같습니다.

iterable_object = [item_expression for item in iterable_list if item_condition]

위 리스트 내포식의 의미는 iterable_list에 있는 요소 하나하나(item)에 대해 item_condition을 만족하는 요소들을 item_expression식을 적용하여 iterable 한 Object (iterable_object)로 만들어서 반환한다는 의미입니다.

<예제>

구구단 3단을 출력하되 짝수가 아닌 것만 출력해봅시다.

gugu_three = [x * 3 for x in range(9) if x % 2 is not 0]
# [3, 9, 15, 21]

그렇다면, 중첩 for문은 어떻게 사용할까요? 이번에는 구구단의 결과값을 모두 출력하는 예제로 알아보겠습니다.

gugudan = [x * y for x in range(1, 10) for y in range(1, 10)]
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]

위 코드는 다음 코드와 동일한 기능을 수행합니다.

gugudan = []
for x in range(1, 10):
    for y in range(1, 10):
        gugudan.append(x * y)

처음 나오는 for문이 바깥에, 나중에 나오는 for문이 안쪽에 있는 모양으로 생각하시면 됩니다.

이제는, 구구단 3단과 7단만 출력해볼까요?

gugudan_three_seven = [x * y for x in range(1, 10) if x is 3 or x is 7 for y in range(1, 10)]
# [3, 6, 9, 12, 15, 18, 21, 24, 27, 7, 14, 21, 28, 35, 42, 49, 56, 63]

위 코드는 다음 코드와 동일한 기능을 수행합니다.

gugudan_three_seven = []
for x in range(1, 10):
    if x is 3 or x is 7:
        for y in range(1, 10):
            gugudan_three_seven.append(x * y)

마지막으로, 바깥쪽의 요소가 안쪽의 요소보다 더 큰 조건 (x > y 인 조건) 에서만 값을 출력해보겠습니다.

gugudan_strange = [x * y for x in range(1, 10) for y in range(1, 10) if x > y]

위 코드는 다음 코드와 동일한 기능을 수행합니다.

gugudan_strange = []
for x in range(1, 10):
    for y in range(1, 10):
        if x > y:
            gugudan_strange.append(x * y)

레퍼런스

성능 팁

https://mingrammer.com/introduce-comprehension-of-python/

댓글

Designed by JB FACTORY