본문 바로가기

파이썬 기초

[파이썬 기초] 리스트 컴프리헨션(list comprehension) 이해하기

리스트 컴프리헨션

리스트 컴프리헨션(List Comprehension) 이해하고 사용하기

파이썬(Python)에서 리스트 컴프리헨션(list comprehension)은 리스트를 간단하고 간결하게 만들 수 있도록 제공하는 방법입니다. 파이썬 유저들 사이에서 보편적으로 사용하고 있으며 조금만 응용하여 사용할 수 있다면 아주 유용한 기능이 될 것입니다.

 

참고로 파이썬에서 컴프리헨션은 리스트 외에도 딕션너리(Dictionart), 집합(Set), 제너레이터(Generator)에서도 동일한 방법으로 사용 가능합니다.

 

간단한 예를 보고 나면 리스트 컴프리헨션에 대한 이해가 쉬울 것입니다.

1부터 10까지 정수의 제곱 값으로 구성된 list_a라는 리스트를 생성하여 봅시다.

 

우선, 가장 단순한 방법으로 아래와 같이 직접 1부터 10까지의 정수를 제곱 계산하고 그 결과 값을 입력하여 리스트를 만드는 방법이 있을 것입니다.

list_a = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

 

다음은 for문을 이용하여 자동으로 list_a라는 리스트에 하나씩 추가하여 생성하는 방법이 있습니다.

list_a = []
for x in range(1, 11):
	list_a.append(x**2)

list_a
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

 

파이썬에서 제공하는 리스트 컴프리헨션 기능을 활용하여 간단하게 1부터 10까지의 제곱 값으로 구성된 리스트를 만들어 보겠습니다.

 

대괄호([ ]) 안에 리스트를 구성하는 표현식(expression, 아래 코드에서 x**2 가 표현식이 됩니다)을 적고 for 문을 뒤에 이어서 작성해주면 됩니다.

 

for 문에서 반복적으로 만들어지는 x가 하나씩 표현식(x**2)에 전달되고 계산된 결과는 리스트에 하나식 삽입되어 아래와 같은 결과가 만들어집니다.

list_a = [x**2 for x in range(1, 11)]

list_a
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

 

처음은 위와 같은 표현이 조금 낯설 수 있겠지만 파이썬에서는 컴프리헨션 방식을 보편적으로 사용하고 있습니다.

 

리스트 컴프리헨션에 대해서 어렵지 않게 이해할 수 있을 것입니다. 그러면 조금 응용해봅시다.

 

리스트 컴프리헨션을 이용하여 만들어 놓은 리트스(lsit_a)에 일괄적으로 100을 더하여 새로운 리스트(list_b)에 저장해 봅시다.

list_b = [ x + 100 for x in list_a]

list_b
[101, 104, 109, 116, 125, 136, 149, 164, 181, 200]

 

 

조금 더 복합한 예제입니다.

for 문 2개를 이용하여 각각의 for 문에서 만들어진 x와 y를 튜플(tuple) 조합을 만드는 예제입니다.

[ (x, y) for x in [1,2,3] for y in [4,5,6] ]
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

 

리스트 컴프리헨션(list comprehension)에는 if 문을 사용하여 조건을 부여할 수도 있습니다.

[x for x in range(1, 11) if x%2 == 0]
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

[(x, y) for x in [1,2,3] for y in [1,2,3] if x != y ]
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

 

다음 예제는 리스트 컴프리헨션을 이용하여 주어진 문자에서 'o'와 공백(' ')만을 제거하는 방법입니다.

words = 'hello python world'

result = ''.join([c for c in words if c not in ['o', ' ']])
result
'hellpythnwrld'