list comprehension

Python 리스트 표현식(List Comprehension) 완벽 가이드

리스트 표현식이란?

파이썬(Python)의 리스트 표현식(List Comprehension)은 반복문과 조건문을 한 줄로 작성하여 새로운 리스트를 생성하는 문법입니다.

일반적인 반복문보다 코드가 간결하며 가독성이 높아 데이터 분석, 웹 개발, 머신러닝, 딥러닝 등 다양한 분야에서 널리 사용됩니다.

기본 문법

리스트 표현식의 기본 형태는 다음과 같습니다.

[표현식 for 변수 in 반복가능객체]

예를 들어 0부터 4까지의 숫자를 리스트로 생성해 보겠습니다.

nums = [x for x in range(5)]
print(nums)

실행 결과

[0, 1, 2, 3, 4]

일반 반복문과 비교

위 코드는 다음과 같은 반복문과 동일합니다.

nums = []

for x in range(5):
    nums.append(x)

print(nums)

리스트 표현식을 사용하면 코드를 더욱 간결하게 작성할 수 있습니다.


값 변환하기

반복하면서 값을 변환할 수도 있습니다.

squares = [x * x for x in range(5)]
print(squares)

실행 결과

[0, 1, 4, 9, 16]

각 숫자의 제곱값이 리스트에 저장됩니다.


조건문 사용하기

특정 조건을 만족하는 데이터만 추출할 수 있습니다.

evens = [x for x in range(10) if x % 2 == 0]
print(evens)

실행 결과

[0, 2, 4, 6, 8]

삼항 연산자 활용하기

조건에 따라 다른 값을 저장할 수도 있습니다.

result = [
    "짝수" if x % 2 == 0 else "홀수"
    for x in range(5)
]

print(result)

실행 결과

['짝수', '홀수', '짝수', '홀수', '짝수']

다중 반복문 사용하기

중첩 반복문도 리스트 표현식으로 작성할 수 있습니다.

pairs = [
    (x, y)
    for x in range(3)
    for y in range(2)
]

print(pairs)

실행 결과

[(0, 0), (0, 1),
 (1, 0), (1, 1),
 (2, 0), (2, 1)]

이는 다음 코드와 동일합니다.

pairs = []

for x in range(3):
    for y in range(2):
        pairs.append((x, y))

중첩 리스트 표현식(Nested List Comprehension)

리스트 표현식 안에 또 다른 리스트 표현식을 포함하는 것을 중첩 리스트 표현식이라고 합니다.

2차원 리스트를 생성하거나 데이터를 변환할 때 자주 사용됩니다.


1. 2차원 리스트 생성하기

3×4 크기의 행렬을 생성해 보겠습니다.

matrix = [
    [0 for _ in range(4)]
    for _ in range(3)
]

print(matrix)

실행 결과

[[0, 0, 0, 0],
 [0, 0, 0, 0],
 [0, 0, 0, 0]]

2. 구구단 생성하기

gugudan = [
    [i * j for j in range(1, 10)]
    for i in range(2, 10)
]

print(gugudan)

실행 결과

[[2, 4, 6, 8, 10, 12, 14, 16, 18],
 [3, 6, 9, 12, 15, 18, 21, 24, 27],
 ...
 [9, 18, 27, 36, 45, 54, 63, 72, 81]]

3. 2차원 리스트 평탄화(Flatten)

딥러닝과 데이터 분석에서는 2차원 데이터를 1차원으로 변환하는 작업이 자주 필요합니다.

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

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

print(flat)

실행 결과

[1, 2, 3, 4, 5, 6, 7, 8, 9]

4. 조건을 포함한 중첩 리스트 표현식

result = [
    x * y
    for x in range(1, 6)
    for y in range(1, 6)
    if x == y
]

print(result)

실행 결과

[1, 4, 9, 16, 25]

Pandas에서의 활용

데이터 분석을 할 때 리스트 표현식은 Pandas와 함께 자주 사용됩니다.

import pandas as pd

df = pd.DataFrame({
    'name': ['Tom', 'Jane', 'Mike', 'Sara'],
    'score': [85, 92, 78, 95]
})

print(df)

실행 결과

   name  score
0   Tom     85
1  Jane     92
2  Mike     78
3  Sara     95

1. 새로운 컬럼 생성

90점 이상이면 A, 그렇지 않으면 B를 부여합니다.

df['grade'] = [
    'A' if score >= 90 else 'B'
    for score in df['score']
]

print(df)

실행 결과

   name  score grade
0   Tom     85     B
1  Jane     92     A
2  Mike     78     B
3  Sara     95     A

2. 문자열 변환

df['name_upper'] = [
    name.upper()
    for name in df['name']
]

print(df)

실행 결과

   name  score grade name_upper
0   Tom     85     B        TOM
1  Jane     92     A       JANE
2  Mike     78     B       MIKE
3  Sara     95     A       SARA

3. 조건 데이터 추출

high_scores = [
    score
    for score in df['score']
    if score >= 80
]

print(high_scores)

실행 결과

[85, 92, 95]

4. 결측치(NaN) 처리

import numpy as np

df = pd.DataFrame({
    'score': [85, np.nan, 78, 95]
})

scores = [
    0 if pd.isna(score) else score
    for score in df['score']
]

print(scores)

실행 결과

[85.0, 0, 78.0, 95.0]

5. 여러 컬럼 동시 처리

df = pd.DataFrame({
    'name': ['Tom', 'Jane', 'Mike'],
    'score': [80, 90, 100]
})

result = [
    f"{name}:{score}"
    for name, score in zip(df['name'], df['score'])
]

print(result)

실행 결과

['Tom:80', 'Jane:90', 'Mike:100']

딥러닝에서의 활용

딥러닝에서는 리스트 표현식을 이용하여 데이터 전처리, 정규화, 레이블 변환 등의 작업을 자주 수행합니다.


1. 이미지 정규화(Normalization)

딥러닝 모델은 일반적으로 픽셀 값을 0~255 범위에서 0~1 범위로 변환하여 사용합니다.

pixels = [0, 64, 128, 192, 255]

normalized = [
    pixel / 255.0
    for pixel in pixels
]

print(normalized)

실행 결과

[0.0,
 0.25098039215686274,
 0.5019607843137255,
 0.7529411764705882,
 1.0]

2. 원-핫 인코딩(One-Hot Encoding)

분류 문제에서 자주 사용되는 기법입니다.

labels = [0, 1, 2]

one_hot = [
    [1 if i == label else 0
     for i in range(3)]
    for label in labels
]

print(one_hot)

실행 결과

[[1, 0, 0],
 [0, 1, 0],
 [0, 0, 1]]

3. 배치 데이터 평탄화(Flatten)

batch = [
    [0.1, 0.3, 0.8],
    [0.2, 0.5, 0.7],
    [0.9, 0.4, 0.1]
]

flat = [
    value
    for sample in batch
    for value in sample
]

print(flat)

실행 결과

[0.1, 0.3, 0.8,
 0.2, 0.5, 0.7,
 0.9, 0.4, 0.1]

4. ReLU 활성화 함수 구현

ReLU 함수는 다음과 같습니다.

f(x) = max(0, x)

예제:

values = [-3, -1, 0, 2, 5]

relu = [
    max(0, x)
    for x in values
]

print(relu)

실행 결과

[0, 0, 0, 2, 5]

5. 예측 결과를 클래스 이름으로 변환

predictions = [0, 2, 1, 0]

class_names = [
    "cat",
    "dog",
    "bird"
]

result = [
    class_names[p]
    for p in predictions
]

print(result)

실행 결과

['cat', 'bird', 'dog', 'cat']

리스트 표현식의 장점

1. 코드가 간결하다

[x*x for x in range(10)]

2. 가독성이 높다

반복문과 리스트 생성이 한 곳에 모여 있어 이해하기 쉽습니다.

3. 실행 속도가 빠른 편이다

일반적인 for문보다 내부적으로 최적화되어 있는 경우가 많습니다.

4. 데이터 전처리에 유용하다

Pandas, NumPy, PyTorch 등에서 자주 활용됩니다.


주의사항

리스트 표현식이 항상 좋은 것은 아닙니다.

너무 복잡한 로직을 한 줄에 작성하면 오히려 가독성이 떨어질 수 있습니다.

result = [
    x*y if x % 2 == 0 else x+y
    for x in range(10)
    for y in range(5)
]

복잡한 로직은 일반 반복문을 사용하는 것이 더 좋은 선택일 수 있습니다.


마무리

리스트 표현식(List Comprehension)은 파이썬 개발자가 반드시 익혀야 하는 핵심 문법입니다.

특히 데이터 분석, Pandas 활용, 머신러닝, 딥러닝 프로젝트에서 매우 자주 등장하며, 코드를 더욱 간결하고 효율적으로 작성할 수 있도록 도와줍니다.

먼저 아래 세 가지 패턴을 익혀두는 것을 추천합니다.

[x for x in data]

[x*x for x in data]

[x for x in data if condition]

그리고 이후에는 중첩 리스트 표현식, Pandas 활용, 딥러닝 전처리 예제까지 학습한다면 실무에서 대부분의 리스트 표현식을 자유롭게 사용할 수 있게 될 것입니다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다