본문 바로가기
내가 공부한 것들

[파이썬] 리스트 내포(List comprehension)

by 2ns 2024. 1. 2.

파이썬에서 리스트 내포(List Comprehension)는 데이터를 다룰 때 굉장히 유용하다.

반복문과 조건문을 사용하여 리스트를 간결하고 효율적으로 생성할 수 있으며, 단 한 줄로 작성이 가능하다.

 

리스트 내포는 코드의 가독성 향상 뿐만 아니라, 단순 for문보다 속도도 빠르다는 장점이 있다.

 

리스트 내포의 기본 구조는 아래와 같다.

[expression for item in iterable if condition]

= [표현식 for 변수 in 반복할 수 있는 대상 if 조건]

 

- expression (표현식): 각 변수에 적용되는 표현식
- item (변수): 반복할 수 있는 대상의 각 항목

- iterable (반복할 수 있는 대상): 반복 가능한 객체(리스트, 튜플, 집합 등)
- if condition (조건): 선택적이며, 이 조건을 만족하는 변수에 대해서만 표현식을 적용

 

 

아래 이와 관련한 세 개의 예제를 다루어보고자 한다.

 

예제 1: 간단한 리스트 내포

numbers = [1, 2, 3, 4, 5]
squared = [n ** 2 for n in numbers]

print(squared)  # 결과: [1, 4, 9, 16, 25]

 

예제 2: 조건을 포함한 리스트 내포

numbers = [1, 2, 3, 4, 5]
even_squared = [n ** 2 for n in numbers if n % 2 == 0]

print(even_squared)  # 결과: [4, 16]

 

예제 3: 문자열 리스트에서 특정 문자를 포함하는 단어 찾기

words = ["apple", "banana", "cherry", "date"]
a_words = [word for word in words if 'a' in word]

print(a_words)  # 결과: ['apple', 'banana', 'date']

 

일반적인 for문과 리스트내포의 속도 차이를 한번 비교해보았다. 얼마나 차이가 날까?

import timeit

# 리스트 생성
numbers = list(range(1, 10001))

# for 문 사용
def for_loop():
    squared_for = []
    for n in numbers:
        squared_for.append(n ** 2)

# 리스트 내포 사용
def list_comprehension():
    squared_comp = [n ** 2 for n in numbers]

# 시간 측정
time_for = timeit.timeit(for_loop, number=1000)
time_comp = timeit.timeit(list_comprehension, number=1000)

print("For 문 사용 시간:", time_for)
print("리스트 내포 사용 시간:", time_comp)

 

 

반복해야 할 숫자가 커질수록 시간의 차이는 더 많이 나게된다.

또한 단순 계산이 아닌 비교, 조건문 등이 붙는다면 계산 시간의 차이는 훨씬 더 나게될 수 있다.

 

그동안 for문으로 작업을 많이 했었는데, 코드가 돌아가는데 많은 시간이 소요될 뿐만 아니라,

코드 자체가 굉장히 비대해져 한눈에 파악하기 어려운 단점이 있었다.

 

앞으로는 리스트 내포를 적극 활용하여 보다 더 효율적인 코드 작업을 할 수 있도록 해야겠다.