파이썬에서는 기존 시퀀스(sequence)를 활용해 새로운 시퀀스를 아주 간결한 코드로 생성할 수 있습니다. 이러한 문법을 컴프리헨션(comprehension)이라고 부르며, 리스트·딕셔너리·셋(set)·제너레이터(generator) 등 다양한 자료구조를 다른 시퀀스로부터 손쉽게 만들어낼 수 있게 해줍니다.
컴프리헨션은 반복문과 조건문을 한 줄로 압축해 표현할 수 있어 코드가 짧아지고 가독성이 높아지는 장점이 있습니다. 경우에 따라 여러 단계의 자료형 변환 과정을 포함하기도 합니다.
1. 리스트 컴프리헨션(List Comprehension)
리스트 컴프리헨션은 기존 리스트의 값을 가공하거나 변환하여 새로운 리스트를 만드는 방식입니다. 아래 예제에서는 주어진 리스트의 각 요소에 3을 더해 새로운 리스트를 생성합니다.
예제
given_list = [x for x in range(5)] print(given_list) new_list = [var+3 for var in given_list] print(new_list)
실행 결과
[0, 1, 2, 3, 4] [3, 4, 5, 6, 7]
위 코드에서 [x for x in range(5)]는 0부터 4까지의 숫자로 리스트를 만들고, 이어서 각 요소에 3을 더한 값으로 새 리스트를 구성합니다. 대괄호 안의 표현식이 각 요소에 적용되는 방식입니다.
2. 딕셔너리 컴프리헨션(Dictionary Comprehension)
딕셔너리 컴프리헨션은 리스트와 유사한 방식으로, 중괄호 {}를 사용해 키(key)와 값(value)의 쌍으로 이루어진 딕셔너리를 생성합니다.
예제
given_list = [x for x in range(5)]
print(given_list)
new_dict = {var: var + 3 for var in given_list}
print(new_dict)실행 결과
[0, 1, 2, 3, 4]
{0: 3, 1: 4, 2: 5, 3: 6, 4: 7}위 예제에서는 리스트의 요소가 키가 되고, 그 요소에 3을 더한 값이 값(value)이 되는 딕셔너리가 만들어집니다.
두 개의 리스트로 딕셔너리 만들기
두 개의 리스트를 준비한 뒤 zip() 함수와 함께 사용하면, 하나의 리스트는 키로, 다른 하나는 값으로 매핑되는 새로운 딕셔너리를 만들 수 있습니다.
예제
list1 = [x for x in range(5)]
list2 = ['Mon','Tue','Wed','Thu','Fri']
print(list1)
print(list2)
new_dict = {key: value for (key, value) in zip(list1, list2)}
print(new_dict)실행 결과
[0, 1, 2, 3, 4]
['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
{0: 'Mon', 1: 'Tue', 2: 'Wed', 3: 'Thu', 4: 'Fri'}zip(list1, list2)는 두 리스트의 요소를 순서대로 짝지어 주므로, 숫자 리스트가 키가 되고 요일 문자열 리스트가 값이 되는 딕셔너리가 완성됩니다.
3. 셋 컴프리헨션(Set Comprehension)
셋(set)도 같은 방식으로 생성할 수 있습니다. 기존 셋이나 리스트로부터 새로운 셋을 만들며, 아래 예제에서는 기존 셋의 각 요소에 3을 더한 새로운 셋을 생성합니다.
예제
given_set = {x for x in range(5)}
print(given_set)
new_set = {var+3 for var in given_set}
print(new_set)실행 결과
{0, 1, 2, 3, 4}
{3, 4, 5, 6, 7}셋은 중복을 허용하지 않는 자료구조이므로, 컴프리헨션 과정에서 중복된 값이 발생하면 자동으로 하나만 남게 됩니다.
4. 제너레이터 컴프리헨션(Generator Comprehension)
기존 리스트로부터 새로운 제너레이터를 만들 수도 있습니다. 제너레이터는 모든 값을 미리 메모리에 저장하지 않고, 값이 필요할 때마다 하나씩 생성하기 때문에 메모리 효율성이 뛰어나다는 큰 장점이 있습니다. 문법은 리스트 컴프리헨션과 거의 동일하지만, 대괄호 [] 대신 소괄호 ()를 사용한다는 점이 다릅니다.
예제
given_list = [x for x in range(5)]
print(given_list)
new_gen = (var+3 for var in given_list)
for var1 in new_gen:
print(var1, end=" ")실행 결과
[0, 1, 2, 3, 4] 3 4 5 6 7
제너레이터는 이터레이터이므로 for 문으로 순회하면서 값을 하나씩 꺼내 사용할 수 있습니다. 대량의 데이터를 처리할 때는 리스트 대신 제너레이터를 사용하는 것이 성능 면에서 유리합니다.
마무리
컴프리헨션은 파이썬다운(Pythonic) 코드를 작성하는 대표적인 문법입니다. 반복문으로 여러 줄에 걸쳐 작성해야 하는 로직을 한 줄로 압축할 수 있어 생산성과 가독성을 동시에 높여 줍니다. 상황에 맞게 리스트·딕셔너리·셋·제너레이터 컴프리헨션을 적절히 활용해 보시기 바랍니다.