Dev

[Dev] 리스트 컴프리헨션 (List Comprehension)

너굴먹 2024. 11. 11. 22:16

파이썬에 리스트 컴프리헨션이라는 방법이 있는데 리스트를 초기화하는 방법 중 하나입니다

대괄호 안에 조건문반목문을 넣어서 리스트를 초기화 하는 방법인데 
처음에 조금 헷갈려가지고 정리하면서 복습하려고 합니다


#1 리스트 컴프리헨션(List Comprehension) 예시

만약 0부터 19까지 중 홀수만 리스트에 초기화하고 싶다면

arr = []
for i in range(20):
  if i%2==1:
    arr.append(i)
print(arr)

#1 Vanilla code 실행결과

간단히 이렇게 작성할 수 있다

하지만 리스트 컴프리헨션을 사용하면 더 간단하게 리스트를 초기화할 수 있음

arr = [i for i in range(20) if i%2==1]
print(arr)

#1 List Comprehension code 실행결과

두 코드의 실행결과는 같지만 리스트 컴프리헨션 문법을 알면 시간절약이 가능함


#2 기본 리스트 컴프리헨션

1부터 9까지 제곱한 값을 리스트로 가져오고 싶다면

arr = [x ** 2 for x in range(1, 10)]
print(arr)

#2 실행결과

range(1, 10)을 사용하여 1부터 9까지의 숫자를 순회하고, 각 숫자를 제곱한 결과를 리스트에 초기화


#3 조건문을 포함한 리스트 컴프리헨션

조건은 하나만 가능한가요?
여러 개도 됩니다

result = [i for i in range(1, 31) if i % 3 == 0 and i % 5 != 0]
print(result)

#3 실행결과

1부터 30까지 숫자 중
3의 배수이면서 5의 배수가 아닌 것들만 가져오려면 조건을 여러 개 붙여주면 된다


#4 2차원 리스트 초기화

리스트 컴프리헨션은 특히 2차원 리스트를 초기화할 때 매우 유용함

N = 3
M = 4
arr =[[0] * M for _ in range(N)]
print(arr)

#4 실행결과

N은 행의 수, M은 열의 수
각 행마다 M개의 0을 가지는 리스트를 생성하여 2차원 리스트로 초기화


#5 다중 for문과 조건이 있는 리스트

이중 for 문을 사용해도 되는데 이렇게 쓰는 건 개인적으로 가독성이 좋지는 않다고 생각함
코드리뷰하는데 이렇게 나오면 벌써 어지러워짐

lst = [i * j for i in range(1, 10) for j in range(2, 10) if i % 2 == 0]
print(lst)

#5 List Comprehension code 실행결과

1부터 9까지 숫자 중 짝수 i와 2부터 9까지 숫자 j를 곱한 값을 리스트에 초기화하는 코드인데
가독성이 썩 좋지는 않다

lst = []
for i in range(1, 10):
    for j in range(2, 10):
        if i % 2 == 0:
            lst.append(i * j)
print(lst)

#5 Vanilla code 실행결과

훨씬 보기 좋구먼

때문에 복잡한 로직에서 리스트를 초기화해야 할 경우에는
그냥 일반적인 for 루프를 쓰는 게 가독성 측면에서 더 나을 수도 있음


#6 이거 헷갈리는데 왜 쓰나요

그냥 조금 귀찮아도 for 반복문 쓰면 되지 않나요?
귀찮다면 어쩔 수 없지만 답은 No

리스트 컴프리헨션을 사용한 문법은 실제 for 루프보다 빠르다는 장점이 있기 때문임

import time

# 일반 for 루프
start = time.time()
result = []
for x in range(1, 1000000):
    result.append(x)
end = time.time()
print("for loop time:", round(end - start, 4))  # 소수점 넷째 자리까지 반올림

# 리스트 컴프리헨션
start = time.time()
result = [x for x in range(1, 1000000)]
end = time.time()
print("List comprehension time:", round(end - start, 4))  # 소수점 넷째 자리까지 반올림

#6 실행결과

동일하게 1부터 999,999까지의 작업을 반복할 때 time 모듈을 가져와서 코드 실행시간을 각각 측정해 비교해 보면
리스트 컴프리헨션을 사용해 생성한 리스트가 더 빠른 걸 볼 수 있음

만약 실행 시간제한이 있는 코테 문제일 경우 효율적인 방법일 수 있음