WjExplor Story

리스트 컴프리헨션(List Comprehension) 본문

Python/Python : Code Study

리스트 컴프리헨션(List Comprehension)

더블유제이플로어 2025. 9. 11. 19:09
result = [x*y for x in range(2,10) for y in range(1,10)]
print(' '.join(map(str,result)))

이 코드는 파이썬의 **리스트 컴프리헨션(List Comprehension)**과 map 함수, 그리고 join 메서드의 특징을 잘 보여주는 예시입니다. 각각의 특징과 추가적인 예시를 통해 더 자세히 알아볼게요.

1. 리스트 컴프리헨션 (List Comprehension)

리스트 컴프리헨션은 리스트를 더 짧고 직관적인 코드로 생성하는 파이썬의 강력한 문법입니다. 반복문과 조건문을 한 줄에 결합하여 리스트를 만들 수 있습니다.

특징:

  • 간결성: 여러 줄의 for 반복문을 한 줄로 줄일 수 있어 코드가 깔끔해집니다.
  • 성능: 일반적인 for 루프에 append를 사용하는 것보다 일반적으로 더 빠릅니다.

예시:

  1. 조건문 추가하기: 50보다 큰 99단 결과만 리스트에 저장해 보세요.
result_over_50 = [x * y for x in range(2, 10) for y in range(1, 10) if x * y > 50]
print(result_over_50)

   2. 문자열 리스트 만들기: 특정 문자열에 각 문자를 추가한 새로운 리스트를 만들 수 있습니다.

words = ['apple', 'banana', 'cherry']
result_with_s = [word + 's' for word in words]
print(result_with_s)
# 결과: ['apples', 'bananas', 'cherrys']

2. map() 함수

map() 함수는 리스트의 모든 요소에 동일한 함수를 적용한 결과를 반환하는 함수입니다.

특징:

  • 일괄 적용: 리스트의 각 요소에 특정 연산이나 함수를 한 번에 적용합니다.
  • 반환 타입: map 객체를 반환하기 때문에, 리스트로 사용하려면 list() 함수로 변환해 줘야 합니다.

예시:

  1. 리스트의 모든 요소를 정수로 변환: 사용자에게 입력받은 문자열 숫자들을 정수로 한 번에 바꿀 때 유용합니다.
str_numbers = ['10', '20', '30']
int_numbers = list(map(int, str_numbers))
print(int_numbers)
# 결과: [10, 20, 30]

   2. 복잡한 함수 적용: 각 숫자에 10을 곱하고 5를 더하는 복잡한 연산을 적용할 수도 있습니다.

numbers = [1, 2, 3]
new_numbers = list(map(lambda x: x * 10 + 5, numbers))
print(new_numbers)
# 결과: [15, 25, 35]

3. str.join() 메서드

join() 메서드는 문자열로 이루어진 리스트를 하나의 문자열로 합쳐주는 역할을 합니다.

특징:

  • 구분자 결합: ' '.join()과 같이 앞에 오는 문자열(공백)이 리스트의 각 요소 사이에 삽입됩니다.
  • 성능: for 루프와 + 연산자를 사용해 문자열을 합치는 것보다 훨씬 효율적입니다.

예시:

  1. 하이픈으로 결합하기:
words = ['Python', 'is', 'fun']
sentence = '-'.join(words)
print(sentence)
# 결과: 'Python-is-fun'

   2. 공백 제거 후 결합하기:

# 사용자 입력에서 공백을 제거하고 붙여주는 경우
user_input = ['hello ', ' world']
cleaned_text = ''.join(word.strip() for word in user_input)
print(cleaned_text)
# 결과: 'helloworld'

리스트 컴프리헨션은 AI 비전 분야에서 매우 자주 사용됩니다.

AI 비전 작업은 데이터를 전처리하고 결과를 후처리하는 과정이 많기 때문에, 여러 데이터에 동일한 작업을 일괄적으로 적용해야 할 때 리스트 컴프리헨션이 유용하게 쓰입니다.

1. 이미지 파일 경로 처리

AI 모델을 학습시키려면 수많은 이미지 파일의 경로를 불러와야 합니다. 특정 확장자(jpg, png 등)를 가진 파일만 필터링하거나, 파일 경로를 통일된 형식으로 바꿀 때 리스트 컴프리헨션을 사용합니다.

import os

# 모든 파일 목록
all_files = os.listdir('/data/images/')

# 확장자가 .jpg인 파일만 필터링
image_files = [f for f in all_files if f.endswith('.jpg')]

print(image_files)
  • 설명: /data/images/ 폴더 내의 모든 파일 중에서 .jpg로 끝나는 파일만 골라 image_files 리스트를 만듭니다.

2. 레이블(Label) 데이터 변환

AI 모델은 숫자 형태의 레이블(Label)을 사용합니다. 이미지 파일 이름에 포함된 클래스(Class) 정보를 추출하여 숫자로 변환할 때 리스트 컴프리헨션을 쓸 수 있습니다.

# 이미지 파일명 리스트 (파일명에 클래스 정보가 포함되어 있음)
image_filenames = ['cat_1.jpg', 'dog_1.jpg', 'cat_2.jpg']

# 'cat'은 0, 'dog'은 1로 변환
labels = [0 if 'cat' in filename else 1 for filename in image_filenames]

print(labels)
# 결과: [0, 1, 0]
  • 설명: 각 파일명에 cat이 포함되어 있으면 0으로, 아니면 1로 매핑하여 새로운 레이블 리스트를 만듭니다.

3. 모델 예측 결과 후처리

모델이 예측한 결과(보통 0과 1 사이의 확률 값)를 사람이 이해하기 쉬운 형태로 바꿀 때도 리스트 컴프리헨션을 사용합니다.

# 모델이 예측한 확률 값 (예측값이 0.5 이상이면 '강아지', 이하면 '고양이')
predictions = [0.92, 0.45, 0.78, 0.12]

# 예측 결과 이진화 (0.5 이상이면 '강아지', 이하면 '고양이')
predicted_classes = ['강아지' if p > 0.5 else '고양이' for p in predictions]

print(predicted_classes)
# 결과: ['강아지', '고양이', '강아지', '고양이']
  • 설명: 각 예측값 p를 조건문으로 확인하여 해당하는 클래스 이름으로 변환합니다.

이처럼 리스트 컴프리헨션은 반복문, 조건문을 간결하게 결합하여 코드를 효율적으로 작성하게 해주기 때문에 AI 비전 분야에서 데이터 전처리 및 후처리 과정에 폭넓게 활용됩니다.


머신 비전(Machine Vision) 분야, 특히 패턴 매칭이나 이미지 처리 시에 매우 유용하게 사용됩니다. 데이터 전처리 및 결과 후처리 과정에서 복잡한 작업을 효율적으로 처리할 수 있기 때문입니다.

패턴 매칭에서의 활용

패턴 매칭은 이미지에서 특정 패턴(객체)을 찾는 작업입니다. 이 과정에서 여러 개의 탐지 결과(바운딩 박스)가 나올 수 있는데, 이 결과들을 필터링하거나 변환할 때 리스트 컴프리헨션을 사용합니다.

# 모델이 예측한 바운딩 박스 리스트 (형식: [x, y, width, height, confidence])
predictions = [
    [100, 50, 20, 30, 0.95],
    [150, 100, 25, 35, 0.88],
    [50, 80, 15, 25, 0.45]
]

# 신뢰도(confidence)가 0.8 이상인 결과만 필터링
high_confidence_boxes = [box for box in predictions if box[4] >= 0.8]

print(high_confidence_boxes)
# 결과: [[100, 50, 20, 30, 0.95], [150, 100, 25, 35, 0.88]]
  • 설명: predictions 리스트의 각 항목(box)에서 다섯 번째 요소인 신뢰도(box[4])가 0.8 이상인 경우만 새로운 리스트에 담습니다.

이미지 처리에서의 활용

이미지 처리 과정에서 픽셀 값들을 일괄적으로 변환하거나, 여러 채널(RGB)을 분리할 때도 리스트 컴프리헨션을 사용할 수 있습니다.

# 이미지의 픽셀 값 (0-255)을 0-1 사이로 정규화
pixel_data = [255, 128, 64, 0]

normalized_pixels = [p / 255.0 for p in pixel_data]

print(normalized_pixels)
# 결과: [1.0, 0.5019607843137255, 0.25098039215686274, 0.0]
  • 설명: 이미지의 각 픽셀 값(p)을 255로 나누어 0과 1 사이의 값으로 정규화하는 작업을 한 줄로 간단하게 처리합니다.

이처럼 리스트 컴프리헨션은 데이터를 필터링하거나, 특정 연산을 모든 데이터에 적용할 때 코드를 간결하게 만들어 주므로, 머신 비전 분야의 다양한 작업에서 활용도가 높습니다.