소개
본 랩 (lab) 에서는 Python 컴프리헨션 (comprehensions) 을 소개합니다. 컴프리헨션은 다른 반복 가능한 (iterable) 객체로부터 리스트, 세트, 딕셔너리와 같은 데이터 구조를 매우 간결한 방식으로 생성할 수 있게 해주는 특별한 구문입니다. 컴프리헨션은 한두 단계의 중첩된 for 루프를 다룰 때 매우 유용하며, 코드를 더 읽기 쉽고 종종 더 효율적으로 만들어 줍니다.
가장 일반적인 유형인 리스트 컴프리헨션 (list comprehensions) 부터 시작하여 전통적인 for 루프와 어떻게 비교되는지 살펴보겠습니다. 그런 다음, 조건부 로직을 추가하여 요소를 필터링하거나 변환하는 방법을 배웁니다. 마지막으로, 동일한 원리가 세트와 딕셔너리를 생성하는 데 어떻게 적용되는지 확인할 것입니다.
리스트 컴프리헨션 (List comprehension)
이 단계에서는 다른 반복 가능한 (iterable) 객체로부터 리스트를 생성하는 간결한 방법인 리스트 컴프리헨션의 기본 구문을 학습합니다. 전통적인 for-loop 방식과 보다 우아한 리스트 컴프리헨션 구문을 비교해 보겠습니다.
참고: WebIDE(VS Code 와 유사) 사용에 익숙하지 않다면, 이 랩 (lab)에서 먼저 학습하십시오.
먼저, 표준 for 루프를 사용하여 기존 리스트로부터 새 리스트를 생성하는 방법을 살펴보겠습니다.
왼쪽 파일 탐색기에서 main.py 파일을 엽니다. 다음 코드를 파일에 복사하여 붙여넣으십시오.
## 전통적인 방식: for 루프를 사용하여 리스트 생성
names = ['Charles', 'Susan', 'Patrick', 'George']
new_list = []
for n in names:
new_list.append(n)
print(new_list)
코드를 실행하려면 터미널 패널에서 + 아이콘을 클릭하고 "New Terminal"을 선택하여 터미널을 엽니다. 그런 다음 다음 명령을 실행합니다.
python3 main.py
다음과 같은 출력을 보게 될 것입니다.
['Charles', 'Susan', 'Patrick', 'George']
이제 리스트 컴프리헨션을 사용하여 동일한 결과를 얻어 보겠습니다. 기본 구문은 [expression for item in iterable] 입니다.
main.py의 내용을 다음 코드로 대체하십시오.
## 리스트 컴프리헨션: 새 리스트를 만드는 간결한 방법
## 구문: [expression for item in iterable]
names = ['Charles', 'Susan', 'Patrick', 'George']
new_list = [n for n in names] ## 모든 이름을 포함하는 리스트 생성
print(new_list)
스크립트를 다시 실행합니다.
python3 main.py
출력은 동일하지만 코드가 훨씬 짧고 설명적입니다.
['Charles', 'Susan', 'Patrick', 'George']
리스트 컴프리헨션은 중첩된 루프 (nested loops) 도 처리할 수 있습니다. 예를 들어, 두 개의 범위 (range) 로부터 튜플 리스트를 생성하려면 다음과 같이 할 수 있습니다.
main.py 파일을 이 코드로 업데이트하고 실행하십시오.
## 중첩된 리스트 컴프리헨션: 두 범위로부터 튜플 생성
## 중첩된 for 루프와 동일함
n = [(a, b) for a in range(1, 3) for b in range(1, 3)]
print(n)
스크립트를 실행합니다.
python3 main.py
출력은 가능한 모든 튜플 조합의 리스트가 됩니다.
[(1, 1), (1, 2), (2, 1), (2, 2)]
조건문 추가하기
이 단계에서는 리스트 컴프리헨션에 조건부 로직을 통합하는 방법을 살펴봅니다. if 문을 사용하여 요소를 필터링하는 방법과 if-else 구조를 사용하여 각 요소에 조건부 표현식을 적용하는 방법을 배웁니다.
'C'로 시작하는 이름만 포함하는 새 리스트를 만들고 싶다고 가정해 봅시다. 전통적인 for 루프를 사용할 경우 루프 내부에 if 문을 추가해야 합니다.
main.py를 다음 코드로 업데이트하세요.
## Traditional approach: filter with if condition
names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
new_list = []
for n in names:
if n.startswith('C'): ## Filter names starting with 'C'
new_list.append(n)
print(new_list)
스크립트를 실행하여 결과를 확인합니다.
python3 main.py
출력:
['Charles', 'Carol']
리스트 컴프리헨션으로 이 작업을 수행하려면 끝에 if 문을 추가합니다. 구문은 [expression for item in iterable if condition] 입니다.
main.py에서 다음을 시도해 보세요.
## List comprehension with condition: filter items
## Syntax: [expression for item in iterable if condition]
names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
new_list = [n for n in names if n.startswith('C')]
print(new_list)
실행하면 동일하게 필터링된 리스트를 얻게 됩니다.
python3 main.py
출력:
['Charles', 'Carol']
또한 if-else 문을 사용하여 모든 요소에 대해 조건부 작업을 수행할 수도 있습니다. 이 경우 if-else 표현식은 for 루프 앞에 옵니다. 구문은 [expression_if_true if condition else expression_if_false for item in iterable] 입니다.
짝수는 두 배로 만들고 홀수는 그대로 유지하는 새 리스트를 만들어 보겠습니다. main.py를 다음 코드로 업데이트하고 실행하세요.
## List comprehension with if-else: conditional expression
## Syntax: [expression_if_true if condition else expression_if_false for item in iterable]
nums = [1, 2, 3, 4, 5, 6]
new_list = [num*2 if num % 2 == 0 else num for num in nums] ## Double even numbers
print(new_list)
스크립트를 실행합니다.
python3 main.py
출력은 짝수만 두 배가 되었음을 보여줍니다.
[1, 4, 3, 8, 5, 12]
집합 컴프리헨션 (Set comprehension)
이 단계에서는 컴프리헨션 구문을 적용하여 셋 (set) 을 생성하는 방법을 이해합니다. 리스트 컴프리헨션의 기본 사항은 셋과 딕셔너리에도 동일하게 적용됩니다.
셋 컴프리헨션은 리스트 컴프리헨션과 매우 유사합니다. 주요 차이점은 대괄호 [] 대신 중괄호 {}를 사용하며, 고유한 요소들의 순서가 없는 컬렉션인 셋을 생성한다는 점입니다.
구문은 {expression for item in iterable} 입니다.
다른 셋으로부터 새 셋을 생성하여 모든 문자열 요소를 대문자로 변환해 보겠습니다. main.py 파일을 다음 코드로 업데이트하세요.
## Set comprehension: create a set using comprehension syntax
## Syntax: {expression for item in iterable}
b = {"abc", "def"}
upper_set = {s.upper() for s in b} ## Convert all strings to uppercase
print(upper_set)
이제 스크립트를 실행합니다.
python3 main.py
출력은 대문자 문자열을 포함하는 새 셋이 됩니다. 셋은 순서가 없으므로 출력에서 요소의 순서는 다를 수 있다는 점에 유의하세요.
{'DEF', 'ABC'}
만약 원본 반복 가능한 객체에 중복된 항목이 있었다면, 셋은 자동으로 중복을 제거하므로 결과 셋에는 고유한 요소만 포함됩니다.
딕셔너리 컴프리헨션 (Dict comprehension)
이 단계에서는 딕셔너리 컴프리헨션을 사용하여 딕셔너리를 구성하는 방법을 배웁니다. 셋 컴프리헨션과 마찬가지로 중괄호 {}를 사용하지만, 콜론 (:) 으로 구분된 키 - 값 쌍이 필요합니다.
구문은 {key_expression: value_expression for item in iterable} 입니다.
일반적인 사용 사례는 기존 딕셔너리의 키 - 값 쌍을 변환하거나 교환하여 새 딕셔너리를 만드는 것입니다. 딕셔너리의 키와 값을 교환해 보겠습니다.
main.py 파일을 다음 코드로 업데이트하세요.
## Dict comprehension: swap keys and values
## Syntax: {key_expression: value_expression for item in iterable}
c = {'name': 'Pooka', 'age': 5}
swapped_dict = {v: k for k, v in c.items()} ## Reverse key-value pairs
print(swapped_dict)
스크립트를 실행합니다.
python3 main.py
출력은 원래의 값이 키가 되고 원래의 키가 값이 된 새 딕셔너리가 됩니다.
{'Pooka': 'name', 5: 'age'}
컴프리헨션을 사용하여 딕셔너리로부터 다른 데이터 유형을 생성할 수도 있습니다. 예를 들어, 딕셔너리의 항목들로부터 형식화된 문자열 리스트를 생성하기 위해 리스트 컴프리헨션을 사용하는 방법은 다음과 같습니다.
main.py의 코드를 이 예제로 바꾸고 실행해 보세요.
## List comprehension from dictionary: create formatted strings
c = {'name': 'Pooka', 'age': 5}
formatted_list = ["{}:{}".format(k.upper(), v) for k, v in c.items()] ## Format as "KEY:value"
print(formatted_list)
스크립트를 실행합니다.
python3 main.py
이것은 딕셔너리가 아닌 문자열 리스트를 생성합니다.
['NAME:Pooka', 'AGE:5']
이는 컴프리헨션을 사용하여 다양한 데이터 구조를 처리하고 변환하는 유연성을 보여줍니다. 이 단계의 마지막 과제를 위해 main.py에 딕셔너리 교환 코드가 포함되어 있는지 확인하세요.
요약
본 랩 (lab) 에서는 Python 의 강력한 컴프리헨션 (comprehension) 구문을 사용하여 리스트, 셋, 딕셔너리를 간결하고 읽기 쉬운 방식으로 생성하는 방법을 배웠습니다.
전통적인 for 루프보다 더 우아한 대안을 제공하는 리스트 컴프리헨션으로 시작했습니다. 이어서 조건부 로직을 추가하는 방법을 배웠는데, 뒤따르는 if를 사용하여 필터링하고 if-else 표현식을 사용하여 요소를 변환했습니다. 마지막으로, 이러한 동일한 원리가 셋 컴프리헨션과 딕셔너리 컴프리헨션에 어떻게 적용되는지 확인했으며, 중괄호 {}를 사용하여 고유한 항목의 셋과 키 - 값 쌍의 딕셔너리를 구축했습니다.
컴프리헨션은 관용적인 (idiomatic) Python 코드의 기본 구성 요소입니다. 이를 숙달하면 코드가 더 효율적이고 우아해질 것입니다. 계속 연습하여 Python 프로그래밍 도구 모음에서 자연스러운 부분이 되도록 하십시오.



