파이썬 리스트 내포: 한 줄로 끝내는 반복의 마법

파이썬 리스트 내포: 한 줄로 끝내는 반복의 마법

“파이썬은 간결하다.” 이 말의 진정한 의미를 깨닫게 해주는 문법이 있다면, 그건 바로 리스트 내포(List Comprehension)입니다. 반복문과 조건문을 한 줄로 표현하는 이 기술은, 마치 복잡한 퍼즐을 순식간에 풀어내는 마법과도 같습니다.

Thank you for reading this post, don't forget to subscribe!

안녕하세요, 오늘은 파이썬의 핵심 기능 중 하나인 리스트 내포에 대해 알아보겠습니다. 이 글은 리스트 내포의 기본 문법부터 실전 예제까지, 하루에 하나씩 배워가는 시리즈의 일환으로 작성되었습니다.

1. 리스트 내포란 무엇인가?

리스트 내포(List Comprehension)는 파이썬의 반복적인 리스트 생성 작업을 한 줄로 간결하게 표현할 수 있는 문법입니다. 반복문과 조건문을 응축한 듯한 이 표현 방식은, 코드의 가독성을 높이고 작성 속도를 단축시켜 줍니다.

예를 들어, 1부터 5까지의 제곱수를 리스트로 만들고 싶다면 보통은 이렇게 작성하겠죠?

squares = []
for i in range(1, 6):
    squares.append(i**2)

하지만 리스트 내포를 사용하면 이렇게 간단해집니다:

squares = [i**2 for i in range(1, 6)]

짧고 강력하죠? 이게 바로 리스트 내포의 마력입니다.

2. 리스트 내포의 기본 문법

기본 형태는 다음과 같습니다:

[expression for item in iterable if condition]
구성 요소설명
expression리스트에 추가될 값 (예: i, i*2)
for item in iterable순회 대상(iterable)을 반복
if condition조건을 만족하는 경우만 포함 (선택사항)

3. 실전 예제로 배우는 리스트 내포

이제 다양한 예제를 통해 리스트 내포에 익숙해져 봅시다. 다음은 자주 사용되는 패턴입니다:


  • 문자열에서 숫자만 추출하기: [int(ch) for ch in "a1b2c3" if ch.isdigit()]

  • 짝수만 필터링: [i for i in range(20) if i % 2 == 0]

  • 중첩 리스트 풀기: [num for row in [[1,2], [3,4]] for num in row]

이처럼 리스트 내포는 단순한 반복부터 중첩 구조까지, 거의 모든 리스트 처리에 활용할 수 있습니다.

4. 리스트 내포의 고급 활용법

리스트 내포는 단순한 반복을 넘어서 중첩 반복문, 조건 분기, 함수 호출까지 포함할 수 있습니다. 이로써 복잡한 데이터 구조도 우아하게 처리할 수 있죠.

예를 들어, 2차원 배열을 1차원으로 펼치는 코드도 이렇게 작성할 수 있습니다:

flattened = [num for row in matrix for num in row]

또는 조건을 다르게 분기하고 싶다면 삼항 조건식도 가능합니다:

labels = ['even' if i % 2 == 0 else 'odd' for i in range(10)]

5. 자주 하는 실수와 주의사항

실수 유형설명
중첩 구조 실수for문 순서를 헷갈리면 전혀 다른 결과가 나옵니다.
조건문 위치 오류if를 어디에 놓는지가 결과값을 바꿉니다.
과도한 로직 포함복잡한 연산을 담으면 가독성이 급격히 떨어집니다.

리스트 내포는 간결해야 합니다. 너무 많은 조건과 반복을 한 줄에 담는 건, 오히려 독이 될 수 있죠.

6. 마무리 및 요약


  • 리스트 내포는 반복문을 간결하게 표현하는 파이썬의 문법입니다.

  • 표현식, 반복문, 조건문을 한 줄로 작성할 수 있습니다.

  • 과도한 로직을 담지 말고, 간결하게 유지하는 것이 핵심입니다.

팩트 베기 문장: “짧은 게 좋다고 배웠지. 하지만 그 짧음 속에, 무얼 담을지는 배운 적 없지.”

처음엔 그냥 신기했어요. 리스트 하나 만들자고 저렇게까지 할 필요가 있을까 싶었죠. 그런데 어느 날, 데이터 전처리를 하다가 for문을 네 번 중첩해 놓은 내 코드를 보고 말았어요. 그때 깨달았죠. 이건 비효율이라는 이름의 늪이라는 걸요.

✔ 핵심은 이것!

  • ✅ 리스트 내포는 익숙해지면 중독된다.
  • ✅ 무작정 한 줄에 모든 걸 담으려 하지 마라. 읽기 쉬운 코드가 더 좋은 코드다.
  • ✅ 조건문이 들어가는 순간, 괄호 위치와 순서를 항상 더블 체크!

제가 리스트 내포를 가장 자주 쓰는 건, CSV 데이터를 불러온 다음 필요한 열만 추출할 때입니다. 한 줄이면 끝나니까요. 하지만 처음엔 자꾸 순서를 틀려서 디버깅하는 데 시간을 꽤 썼죠. 그래서 저는 리스트 내포를 쓸 땐 항상 종이에 먼저 순서를 그려보고 시작해요. 그게 작은 팁이지만 가장 확실한 팁입니다.

그건 선택의 문제가 아니었어. 그냥 내가 익숙하지 않았을 뿐이었지.

리스트 내포가 무조건 좋은 건가요?
아니요. 간결함이 항상 가독성을 담보하진 않습니다. 너무 복잡한 로직은 오히려 전통적인 for문이 더 낫습니다.
if 조건은 어디에 넣는 게 맞나요?
조건이 필터링 목적이라면 반복문 뒤에, 값 자체를 분기하려면 앞쪽 expression에 삼항 연산을 넣는 게 맞습니다.
중첩 리스트 내포도 가능한가요?
가능합니다. 다만 for문 순서가 정확해야 하며, 가독성을 해치지 않는 선에서만 사용하세요.
리스트 내포는 속도도 빠른가요?
일반적으로는 그렇습니다. 특히 반복이 많은 작업에서 내부적으로 최적화된 구조이기 때문에 성능 이점이 있습니다.
파이썬 외의 언어에도 비슷한 문법이 있나요?
네. JavaScript의 map/filter, Haskell의 list comprehension 등에서 유사한 개념을 찾을 수 있습니다.

리스트 내포 작동 원리 시각화

리스트 내포 구조 이미지

출처: Real Python

리스트 내포 개념 영상 (5분 요약)

리스트 내포는 단순한 문법 이상의 의미를 가집니다. 사고 방식의 전환, 더 나은 코드에 대한 의지, 그리고 가독성과 효율을 동시에 추구하는 프로그래밍 철학이 담겨 있죠. 이 작은 한 줄이, 여러분의 코드 습관을 바꿔놓을 수도 있습니다.

이 콘텐츠의 만족도는?

⭐⭐⭐⭐⭐ (5.0/5)

 


HANSORI.AI_Blog Labs에서 더 알아보기

구독을 신청하면 최신 게시물을 이메일로 받아볼 수 있습니다.