Python 기초

리스트 함축

파이썬은 "리스트 함축(list comprehensions)" 또는 "리스트 컴프리헨션"이라는 개념을 지원합니다. comprehension은 함축, 포함, 내포라는 의미입니다.

리스트 함축은 수학자들이 집합을 정의하는 것과 유사합니다. 수학에서 제곱값의 집합은 {{ x^{2} | x \in N }} 와 같이 정의됩니다.

즉 자연수에 속하는 x에 대하여 x^{2} 값들이 모여서 집합을 생성합니다.

 

파이썬에서 리스트를 수학과 유사하게 정의할 수 있습니다. 파이썬에는 다음과 같이 0부터 9까지의 자연수에 대하여 제곱값의 리스트를 정의할 수 있습니다.

S = [ x ** 2 for x in range(10) ]

 

위의 문장을 해석해보면 다음과 같습니다. "range(10)에 속하는 모든 정수에 대하여 x^{2}을 계산하여 리스트를 생성한다".

결과적으로 다음과 같은 리스트가 됩니다.

S = [ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 ]

 

리스트 함축은 다음과 같은 형식을 가집니다.

[ expression for i in old_list if filter(i) ]
  • expression : 출력식을 의미합니다.
  • for i in old_list : 변수의 범위를 의미합니다.
  • if filter(i) : 선택사항으로 이 조건이 참이어야 새로운 리스트에 항목이 추가됩니다.

 

위의 형식을 풀어쓴다면 다음과 같습니다.

new_list = []

for i in old_list:
	if filter(i):
		new_list.append(expression(i))

 

리스트 함축을 사용하면 아주 간결하게 리스트를 생성할 수 있다는 큰 장점이 있습니다.

앞의 제곱의 집합을 리스트 함축으로 표현한 예를 다시 분석하여 봅시다.

S = [ x ** 2 for x in range(10) ]
  • x는 입력 리스트의 요소를 나타내는 변수입니다.
  • x ** 2는 출력식으로서 새로운 리스트의 요소를 생성합니다.
  • range(10)은 입력 리스트를 나타냅니다.
  • [ ... ] 은 결과가 새로운 리스트라는 것을 의미합니다.

 

만약 리스트 함축을 사용하지 않는다면 다음과 같이 반복문을 사용해야 할 것입니다.

squares = []

for x in range(10):
	squares.append(x ** 2)

 

위의 코드를 그림으로 나타내면 다음과 같습니다.

 

리스트 [3, 4, 5]의 모든 항목에 2를 곱해서 새로운 리스트를 생성하는 문장은 다음과 같습니다.

list1 = [3, 4, 5]
list2 = [x * 2 for x in list1]
print(list2)

 

<실행 결과>

[6, 8, 10]

 

조건이 붙는 리스트 함축

리스트 함축에는 if를 사용하여 조건이 추가될 수 있습니다. 예를 들어 0 부터 9 사이의 정수 중에서 짝수의 집합을 리스트 함축으로 표현하면 다음과 같습니다.

M = [x for x in range(10) if x % 2 == 0]
print(M)
  • x : 출력식
  • range(10) : 입력 리스트
  • if x % 2 == 0 : 조건

 

<실행 결과>

[0, 2, 4, 6, 8]

 

다양한 자료형에 대한 리스트 함축

리스트 함축은 숫자에 대해서만 적용되는 것은 아니다. 어떤 자료형에 대해서도 리스트 함축을 적용할 수 있습니다.

단어를 저장하는 리스트를 가정합시다. 단어의 첫 글자만을 추출하여 리스트로 만드는 문장을 작성해봅시다.

list = ["커지는", "헐빗빗빗", "빨라지는데"]
items = [word[0] for word in list]
print(items)

 

<실행 결과>

['커', '헐', '빨']

 

추가적인 예로 문자열을 구성하는 단어를 추출하여 단어의 길이를 계산하고 이것을 모아서 새로운 리스트로 생성해봅시다.

word_list = '내가 그린 기린 그림은 잘 그린 기린 그림이고 니가 그린 기린 그림은 잘 못 그린 기린 그림이다.'.split()
result_list = [len(w) for w in word_list]
print(result_list)

 

<실행 결과>

[2, 2, 2, 3, 1, 2, 2, 4, 2, 2, 2, 3, 1, 1, 2, 2, 5]

 

상호곱(Cross product) 형태의 집합

리스트 함축은 2개의 집합의 상호곱 형태로도 표현할 수 있습니다. 예를 들어 색상의 집합과 자동차의 집합을 상호곱하여 새로운 리스트를 생성할 수 있습니다.

colors = ["white", "silver", "black"]
cars = ["bmw5", "sonata", "malibu", "sm6"]
colored_cars = [ (x, y) for x in colors for y in cars ]
print(colored_cars)

 

<실행 결과>

[('white', 'bmw5'), ('white', 'sonata'), ('white', 'malibu'), ('white', 'sm6'), ('silver', 'bmw5'), ('silver', 'sonata'), ('silver', 'malibu'), ('silver', 'sm6'), ('black', 'bmw5'), ('black', 'sonata'), ('black', 'malibu'), ('black', 'sm6')]

 

colors 리스트의 원소와 cars 리스트의 원소가 하나씩 짝지어져 튜플이 되고 이 튜플이 모여 리스트가 됩니다.

 

도전 과제

피타고라스의 정리를 만족하는 삼각형들을 리스트 함축을 이용하여 모두 찾아봅시다. 삼각형 한 변의 길이는 1부터 30 이하입니다.

pythagoras formula example에 대한 이미지 검색결과

 

<실행 결과>

[(3, 4, 5), (5, 12, 13), (6, 8, 10), (7, 24, 25), (8, 15, 17), (9, 12, 15), (10, 24, 26), (12, 16, 20), (15, 20, 25), (20, 21, 29)]