- 기본 형태는
[표현식 for 항목 in 이터러블 if 조건]입니다. - 끝에 붙이는 단순한
if는 걸러내고, 앞에 두는if-else는 두 값 중 하나를 고릅니다. - 저희 테스트에서 컴프리헨션은
append를 쓰는 반복문보다 약 37% 빨랐습니다. - 데이터가 매우 크면 제너레이터 표현식을, 로직에 여러 명확한 단계가 필요하면 일반 반복문을 쓰세요.
파이썬 리스트 컴프리헨션은 어떤 이터러블에서든 읽기 쉬운 한 줄로 새 리스트를 만듭니다. 빈 리스트를 만들고 반복하며 append를 호출하는 대신, 원하는 결과를 서술합니다.
이 가이드는 기본 형태에서 시작해 필터, 중첩 반복문, 그리고 저희가 직접 측정한 시간까지 다룹니다. 파이썬이 처음이라면 초보자를 위한 파이썬 튜토리얼(영문)부터 보시고, 가상 환경 가이드(영문)로 환경을 깔끔하게 유지하세요.
파이썬 리스트 컴프리헨션 문법
왼쪽에서 오른쪽으로 읽습니다. 표현식은 새 항목이 어떤 모양인지, for 부분은 항목이 어디서 오는지 알려 줍니다.
squares = [x * x for x in range(6)]
print(squares) # [0, 1, 4, 9, 16, 25]
names = [" Hi ", " QA "]
clean = [n.strip().lower() for n in names]
print(clean) # ['hi', 'qa']
같은 결과를 반복문으로 만들면 세 줄이 더 필요합니다. 한 줄이 읽기 쉬운 상태로 유지되는 한, 이 간결함이 핵심입니다.
조건으로 항목 걸러내기
반복문 뒤에 if를 붙이면 조건을 통과한 항목만 남습니다.
evens = [x for x in range(10) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
if-else를 쓴 파이썬 리스트 컴프리헨션
모든 항목에 대해 값을 만들고 싶다면 if-else를 for 앞에 두세요. 끝에 else를 두면 문법 오류가 되기 때문에 초보자가 가장 많이 틀리는 부분입니다.
labels = ["even" if x % 2 == 0 else "odd" for x in range(4)]
print(labels) # ['even', 'odd', 'even', 'odd']
기억할 규칙: 끝의 if는 항목을 없애고, 앞의 if-else는 항목을 바꿉니다. if-else에서는 리스트 길이가 그대로입니다.
중첩 반복문과 평탄화
여러 for 절은 중첩 반복문과 같은 순서로 읽습니다. 리스트의 리스트를 평탄화하거나 쌍을 만들 때 쓰세요.
matrix = [[1, 2, 3], [4, 5, 6]]
flat = [n for row in matrix for n in row]
print(flat) # [1, 2, 3, 4, 5, 6]
pairs = [(x, y) for x in range(1, 3) for y in "ab"]
print(pairs) # [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
행렬을 전치하려면 컴프리헨션 안에 다른 컴프리헨션을 넣습니다. [[r[i] for r in matrix] for i in range(3)]는 [[1, 4], [2, 5], [3, 6]]을 만듭니다. 가독성이 떨어지기 전의 현실적인 한계는 두 단계입니다.
딕셔너리, 집합, 제너레이터 형태
괄호만 바꾸면 같은 아이디어로 다른 자료형을 만들 수 있습니다.
lengths = {w: len(w) for w in ["pip", "venv", "uv"]} # {'pip': 3, 'venv': 4, 'uv': 2}
unique = {len(w) for w in ["pip", "venv", "uv", "git"]} # {2, 3, 4}
total = sum(x * x for x in range(1_000_000)) # generator, no list
자료형 자체의 비교는 리스트, 튜플, 집합, 딕셔너리 가이드(영문)에서 확인하세요.
속도와 메모리: 저희가 측정한 결과
Python 3.13.6에서 정수 100,000개로 각 방식을 측정하고, 다섯 번 실행 중 가장 좋은 값을 사용했습니다. 숫자는 환경마다 다르지만 순서는 일정합니다.
| 작업 | 시간 |
|---|---|
append를 쓰는 반복문(각 항목을 2배로) | 5.18 ms |
| 리스트 컴프리헨션(각 항목을 2배로) | 3.25 ms |
list(map(lambda ...)) | 6.50 ms |
| 반복문으로 짝수 거르기 | 3.62 ms |
| 컴프리헨션으로 짝수 거르기 | 3.43 ms |
컴프리헨션은 append 반복문보다 분명히 빠르지만, 시간 대부분이 조건 검사에 쓰이면 차이가 줄어듭니다. 메모리 면에서는 2배로 만든 정수 100만 개의 리스트가 약 8.4 MB였고, 같은 내용의 제너레이터 객체는 200바이트였습니다. 값을 하나씩 생성하기 때문입니다.
리스트 컴프리헨션을 쓰지 말아야 할 때
- 출력이나 저장 같은 부수 효과만 필요할 때. 일반 반복문을 쓰세요. 컴프리헨션은 쓸모없는 리스트를 만듭니다.
- 로직이 여러 단계일 때. 두 번째 변수나
try가 필요하면 반복문이나 작은 함수를 작성하세요. - 데이터가 매우 클 때. 제너레이터 표현식을 쓰면 파이썬이 전체 리스트를 메모리에 두지 않습니다.
for절이 두 개를 넘을 때. 다음에 읽을 사람을 위해 이름 있는 단계로 나누세요.
마무리
짧은 한 줄이 의도를 정확히 전달할 때는 파이썬 리스트 컴프리헨션을, 그렇지 않을 때는 반복문을 쓰세요. 기본 형태로 시작해 필터를 하나 더하고, 순서가 자연스러워질 때까지 if-else 형태를 연습해 보세요.
자주 묻는 질문
파이썬의 리스트 컴프리헨션이란 무엇인가요?
이터러블의 각 항목에 표현식을 적용해 리스트를 만드는 간결한 방법이며, 선택적으로 조건을 붙여 걸러낼 수 있습니다.
리스트 컴프리헨션에서 if-else는 어떻게 쓰나요?
조건 표현식을 for 절 앞에 두세요. 예: ["even" if x % 2 == 0 else "odd" for x in nums]. 단순한 필터는 반복문 뒤에 if 하나만 둡니다.
리스트 컴프리헨션이 for 반복문보다 빠른가요?
대체로 그렇습니다. 100,000개 항목 테스트에서 append를 쓰는 반복문보다 약 37% 빨랐지만, 먼저 가독성을 기준으로 판단하세요.
리스트 컴프리헨션과 제너레이터 표현식의 차이는 무엇인가요?
리스트 컴프리헨션은 전체 리스트를 한 번에 메모리에 만듭니다. 제너레이터 표현식은 소괄호를 쓰고 값을 하나씩 생성하므로 큰 데이터에서 메모리를 아낄 수 있습니다.
리스트 컴프리헨션을 중첩할 수 있나요?
네, 행렬을 평탄화하거나 전치할 때 쓸 수 있습니다. 두 단계까지만 쓰고, 읽기 어려워지면 반복문으로 바꾸세요.
더 배우기 (영문 글)
테스트, WordPress, SEO에 도움이 필요하신가요?
저희는 팀이 더 나은 소프트웨어를 출시하고 사이트를 성장시키도록 돕습니다. 어떤 작업을 하고 계신지 알려 주시면 명확한 다음 단계를 제안해 드립니다.
추가 가이드 테스트, AI 및 최신 개발
이 기사가 마음에 드셨나요? 주제를 선택하고 최신 튜토리얼로 바로 이동하세요.
AI 환각 설명: 언어 모델이 사물을 구성하는 이유와 이를 줄이는 방법
AI 환각은 그것이 무엇인지, 언어 모델이 환각을 생성하는 이유, 일반적인 유형, 접지 및 프롬프트를 통해 환각을 줄이는 방법, 그리고 우리가 실행한 간단한 점검에 대해 설명했습니다.
기사 읽기 →DevOps환경 변수 설명: .env 파일, 비밀 및 구성이 올바르게 완료되었습니다.
우리가 실행한 Python 예제를 통해 설명된 환경 변수: 읽기 및 설정, 모든 값이 문자열인 이유, .env 파일, 프로세스 상속, 비밀 및 유효성 검사.
기사 읽기 →소프트웨어 개발API 속도 제한 설명: 알고리즘, 헤더 및 429 오류 처리
우리가 실행한 시뮬레이션을 통해 설명된 API 속도 제한: 토큰 버킷, 고정 창, 슬라이딩 창, 429 응답, 속도 제한 헤더, 백오프를 사용한 재시도 및 테스트 제한.
기사 읽기 →테스트 자동화Python에서 조롱: unittest.mock, 패치 및 테스트를 거짓말로 만드는 실수
Unittest.mock을 사용하여 Python에서 모의, 테스트됨: 모의 및 return_value, 부작용, 이름이 사용되는 패치, 사양 및 자동 사양, 모의 날짜 및 일반적인 실수.
기사 읽기 →소프트웨어 테스트코드 커버리지 설명: 회선 커버리지와 분기 커버리지 및 100%의 실제 의미
실제 Coverage.py 실행을 통해 설명되는 코드 적용 범위: 라인, 분기 및 조건 적용 범위, 보고서 읽기, 100% 적용 범위가 여전히 버그를 놓칠 수 있는 이유 및 합리적인 대상.
기사 읽기 →데이터베이스 및 SQLSQL의 DELETE vs TRUNCATE vs DROP: 차이점, 롤백 및 사용 시기
테스트된 SQL을 통해 DELETE 대 TRUNCATE 대 DROP에 대해 설명합니다. 각각의 제거, 롤백, 트리거, ID 재설정, 속도 및 PostgreSQL, MySQL, SQL Server 및 SQLite의 차이점.
기사 읽기 →데이터베이스 및 SQLSQL 뷰 설명: 예제를 통해 함정 생성, 사용 및 방지
우리가 실행한 쿼리로 설명된 SQL 뷰: 뷰 생성, 실시간 결과, 열 숨기기, 성능, 업데이트 가능하고 구체화된 뷰, 손상된 종속성 및 모범 사례.
기사 읽기 →소프트웨어 개발TypeScript 인터페이스와 유형: 실제 차이점, 컴파일러로 테스트
TypeScript 인터페이스 대 유형, 실제 컴파일러로 확인: 둘 다 할 수 있는 것, 하나만 할 수 있는 것, 선언 병합, 확장 대 교차점 및 따라야 할 간단한 규칙.
기사 읽기 →소프트웨어 개발Python *args 및 **kwargs 설명: 명확한 예가 포함된 유연한 함수
Python *args 및 **kwargs는 우리가 실행한 코드(패킹 및 언패킹, 매개변수 순서, 키워드 전용 및 위치 전용 인수, 데코레이터 및 일반적인 오류)를 설명했습니다.
기사 읽기 →소프트웨어 개발Python Lambda 함수: 구문, 실제 사용 및 사용하지 말아야 할 경우
Python 람다 함수는 구문, 키를 사용한 정렬, 맵 및 필터, 클로저, 후기 바인딩 트랩, 일반 def가 더 나은 선택인 경우 등 우리가 실행한 코드로 설명되었습니다.
기사 읽기 →인공지능AI 에이전트란 무엇입니까? 작동 방식, 간단한 에이전트 루프를 사용하여 실행할 수 있음
AI 에이전트란 무엇입니까? 우리가 실행한 작은 Python 루프, 실제 위험 및 간단한 챗봇이 더 나은 선택일 때 에이전트 루프, 도구, 메모리 및 가드레일에 대한 일반 가이드입니다.
기사 읽기 →DevOps모니터링과 관찰 가능성: 로그, 지표, 추적을 통한 실제 차이점
모니터링과 관찰 가능성 설명: 알려진 오류와 알려지지 않은 오류, 로그, 지표 및 추적, 결제 사건 안내, 골든 신호, OpenTelemetry 및 유용한 경고.
기사 읽기 →DevOpsDocker 볼륨과 바인딩 마운트: 컨테이너 데이터를 올바른 방식으로 유지
Docker 볼륨과 바인드 마운트 설명: 컨테이너 데이터가 사라지는 이유, 명명된 볼륨, 바인드 마운트, tmpfs, Compose 예제, 백업, 권한 및 각 사용 시기.
기사 읽기 →테스트 자동화TDD와 BDD: 주요 차이점, 두 가지 방식으로 구축된 하나의 기능 및 각 사용 시기
TDD와 BDD는 두 가지 방식으로 구축된 하나의 할인 기능, 즉 우리가 실행한 코드를 사용한 적록 리팩토링, 주어진 시점 시나리오, 도구, 장단점 및 각 사용 시기를 설명합니다.
기사 읽기 →소프트웨어 개발Git merge vs rebase: 차이점, 예제, 언제 무엇을 쓸까
Git merge vs rebase를 실제 로그 출력, 비교표, rebase의 황금률, 안전한 팀 워크플로로 설명합니다.
기사 읽기 →소프트웨어 개발파이썬 리스트 컴프리헨션: 문법, 예제, 피해야 할 때
파이썬 리스트 컴프리헨션 설명: 문법, 필터링, if-else, 중첩 반복문, 실제 측정 시간, 그리고 일반 for 반복문이 더 나은 경우.
기사 읽기 →데이터베이스 및 SQL예제로 쉽게 배우는 SQL JOIN (Inner, Left, Right, Full)
샘플 테이블과 쿼리로 SQL JOIN을 단계별로 이해하세요. INNER, LEFT, RIGHT, FULL, CROSS, SELF와 흔한 실수, 성능 팁까지 정리했습니다.
기사 읽기 →