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

2024. 11. 11. 22:16·Dev

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

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


#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 모듈을 가져와서 코드 실행시간을 각각 측정해 비교해 보면
리스트 컴프리헨션을 사용해 생성한 리스트가 더 빠른 걸 볼 수 있음

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

'Dev' 카테고리의 다른 글
  • [Dev] AWS Lightsail로 서버 만들기 (Linux/Ubuntu) - Instance 생성 #1
  • [Dev] macOS homebrew, nvm, node.js Setting
  • [Dev] Unix의 구조, 커널과 시스템 호출
  • [Dev] 말썽쟁이 이클립스 오류해결 모음
너굴먹
너굴먹
해랑사 을신당는 나
  • 너굴먹
    햄스터가 갱스터가 될때까지
    너굴먹
  • 전체
    오늘
    어제
    • 분류 전체보기 (36)
      • Dev (17)
      • Computer (6)
      • Project (7)
      • CodingTest (2)
      • 일상 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    2진수
    실수 변환
    플립플롭
    소수 변환
    정처기 필기
    숫자 자료형
    숫 자료형
    R-S래치
    경기도갭이어프로그램
    래치
    RS래치
    정보처리기사
    필기
    오답노트
    roboflow
    c라이브러리
    10진수
    GithubAction
    python
    Lightsail
    trunk-based
    cbt
    python #max #min #최댓값 #최솟값
    아이패드 m4
    파이썬
    코딩테스트
    YOLOv5
    AWS
    vercel
    actions secrets and variables
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
너굴먹
[Dev] 리스트 컴프리헨션 (List Comprehension)
상단으로

티스토리툴바