파이썬에 리스트 컴프리헨션이라는 방법이 있는데 리스트를 초기화하는 방법 중 하나입니다
대괄호 안에 조건문과 반목문을 넣어서 리스트를 초기화 하는 방법인데
처음에 조금 헷갈려가지고 정리하면서 복습하려고 합니다
#1 리스트 컴프리헨션(List Comprehension) 예시
만약 0부터 19까지 중 홀수만 리스트에 초기화하고 싶다면
arr = []
for i in range(20):
if i%2==1:
arr.append(i)
print(arr)
간단히 이렇게 작성할 수 있다
하지만 리스트 컴프리헨션을 사용하면 더 간단하게 리스트를 초기화할 수 있음
arr = [i for i in range(20) if i%2==1]
print(arr)
두 코드의 실행결과는 같지만 리스트 컴프리헨션 문법을 알면 시간절약이 가능함
#2 기본 리스트 컴프리헨션
1부터 9까지 제곱한 값을 리스트로 가져오고 싶다면
arr = [x ** 2 for x in range(1, 10)]
print(arr)
range(1, 10)을 사용하여 1부터 9까지의 숫자를 순회하고, 각 숫자를 제곱한 결과를 리스트에 초기화
#3 조건문을 포함한 리스트 컴프리헨션
조건은 하나만 가능한가요?
여러 개도 됩니다
result = [i for i in range(1, 31) if i % 3 == 0 and i % 5 != 0]
print(result)
1부터 30까지 숫자 중
3의 배수이면서 5의 배수가 아닌 것들만 가져오려면 조건을 여러 개 붙여주면 된다
#4 2차원 리스트 초기화
리스트 컴프리헨션은 특히 2차원 리스트를 초기화할 때 매우 유용함
N = 3
M = 4
arr =[[0] * M for _ in range(N)]
print(arr)
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)
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)
훨씬 보기 좋구먼
때문에 복잡한 로직에서 리스트를 초기화해야 할 경우에는
그냥 일반적인 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)) # 소수점 넷째 자리까지 반올림
동일하게 1부터 999,999까지의 작업을 반복할 때 time 모듈을 가져와서 코드 실행시간을 각각 측정해 비교해 보면
리스트 컴프리헨션을 사용해 생성한 리스트가 더 빠른 걸 볼 수 있음
만약 실행 시간제한이 있는 코테 문제일 경우 효율적인 방법일 수 있음