1. 내포(comprehension)란?
내포(comprehension)는 간결하고 효율적인 방식으로 리스트, 집합, 딕셔너리을 생성할 수 있는 기능입니다. 이 기능을 사용하면 for문과 조건문을 사용한 코드를 더 간결하게 표현할 수 있습니다. 내포를 사용할 때 주의 할점이 있습니다. 코드가 너무 복잡해지거나 가독성이 떨어진다면 일반적인 반복문과 조건문을 사용하는 것이 좋습니다.
2. 리스트 내포(list comprehension)
리스트 내포는 아래와 같은 기본 구조를 가지고 있습니다.
- expression: 각 항목에 적용할 표현식입니다.
- item: 반복자(iterable)에서 가져온 항목입니다.
- iterable: 반복 가능한 객체입니다.
- condition: 항목에 대한 조건문입니다. 조건문은 생략 가능합니다.
[expression for item in iterable if condition]
예를 들어 1부터 10까지의 정수 중 짝수의 제곱으로 이루어진 리스트를 생성하고자 한다면 다음과 같이 코드를 작성하면 됩니다.
even_numbers = [x for x in range(10) if x % 2 == 0]
print(even_numbers) # 출력: [0, 2, 4, 6, 8]
내포를 이용해 아래 코드와 같이 문자열 리스트에서 각 문자열의 길이를 구하는 리스트를 생성할 수도 있습니다.
words = ['apple', 'banana', 'cherry']
word_lengths = [len(word) for word in words]
print(word_lengths) # 출력: [5, 6, 6]
3. 집합 내포(set comprehension)
집합 내포는 리스트 내포와 유사한 구문으로 작성할 수 있습니다.
- expression: 각 항목에 적용할 표현식입니다.
- item: 반복자(iterable)에서 가져온 항목입니다.
- iterable: 반복 가능한 객체입니다.
- condition: 항목에 대한 조건문입니다. 조건문은 생략 가능합니다.
{expression for item in iterable if condition}
예를 들어 주어진 리스트에서 중복된 값을 제거한 집합을 생성하고자 한다면 다음과 같이 코드를 작성하면 됩니다.
numbers = [1, 2, 3, 2, 1, 4, 5, 4, 6]
unique_numbers = {x for x in numbers}
print(unique_numbers) # 출력: {1, 2, 3, 4, 5, 6}
4. 딕셔너리 내포
딕셔너리 내포는 다음과 같은 구문으로 작성할 수 있습니다.
- key_expression: 각 항목의 키를 나타냅니다.
- value_expression : 각 항목의 값을 나타냅니다.
- item: 반복자(iterable)에서 가져온 항목입니다.
- iterable: 반복 가능한 객체입니다.
- condition: 항목에 대한 조건문입니다. 조건문은 생략 가능합니다.
{key_expression: value_expression for item in iterable if condition}
예를 들어, 각 문자를 키로 하고 해당 문자의 아스키 코드를 값으로 하는 딕셔너리를 생성하고자 한다면 다음과 같이 작성할 수 있습니다.
characters = 'abcde'
ascii_map = {char: ord(char) for char in characters}
print(ascii_map) # 출력: {'a': 97, 'b': 98, 'c': 99, 'd': 100, 'e': 101}
5. 연습 문제
문제 1. 리스트 내포를 사용하여 문자열 길이를 구하기
더보기
words = ['apple', 'banana', 'cherry']
lengths = [len(word) for word in words]
print(lengths) # 출력: [5, 6, 6]
문제2. 딕셔너리 내포를 사용하여 키-값 쌍을 뒤깁기
더보기
original_dict = {'a': 1, 'b': 2, 'c': 3}
reversed_dict = {value: key for key, value in original_dict.items()}
print(reversed_dict) # 출력: {1: 'a', 2: 'b', 3: 'c'}
문제3 리스트 내포를 사용하여 행렬 전치하기
더보기
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
transposed = [[row[i] for row in matrix] for i in range(len(matrix))]
print(transposed) # 출력: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]