[Python] 리스트, 집합, 딕셔너리의 내포(comprehension)란?

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]]