컴프리헨션은 파이썬의 자료구조(list, dictionary, set)에 데이터를 좀 더 쉽고 간결하게 담기 위한 문법입니다.
여기서 말하는 '쉽고 간결하게' 데이터를 담는 방법이란 반복문과 조건문을 결합하여 하나의 구문으로 만들어 담는 것을 의미합니다.
컴프리헨션은 우리말로 '내포'라는 뜻으로, 리스트 컴프리헨션은 리스트 안에 코드가 내포되어 실행되는 것을 의미한다. 잘 활용하면 리스트 데이터를 반복해서 처리해야 할 때 코드를 한 줄로 작성할 수 있어서 편하다.
대괄호 [ ]
안에 표현식
과 for문
을 작성하여 사용할 수 있다.
list_variable = [expression for 변수 in iterable]
list_variable = [반복 실행문 for 반복 변수 in 반복 범위]
iterable
로부터 값을 하나 꺼내와서 변수
에 담는다.표현식(expression)
을 실행한다.iterable
로부터 받을 값이 없을 때까지 1~3번 과정을 반복한다.list_a = [i for i in range(1, 10)]
print(list_a)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
대괄호[ ]
대신 list()
함수를 이용할 수도 있다.
list_b = list(1**3 for i in range (10))
print(list_b)
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
⚠️ 대괄호 [ ]
방식을 이용하는 것이 좋다.
⭐ 컴프리헨션 문법에서는 if문
과 중첩 for문
을 사용할 수 있다.
list_variable = [expression for 변수 in iterable if 조건식]
list_c = [i for i in range(1) if i % 3 == 0]
print(list_c)
[0, 3, 6, 9]
반복 가능한 객체를 꺼내 조건문에 부합하는 것만 변수에 담아 표현식의 결과를 리스트의 요소에 담아 list_c
변수에 담는다.
list_variable = [expression for 변수 in iterable for 변수 in iterable]
🔸 상황 1 : 리스트에 순차적으로 1부터 10까지의 값을 저장하고 싶을 때
🔹 예시 1 : 빈 리스트
를 만들고 append()
함수로 하나씩 추가하는 방법
data = []
data.append(1)
data.append(2)
...
data.append(9)
data.append(10)
🔹 예시 2 : for문
과 range()
함수를 사용하는 방법
data = []
for i in range(1, 11):
data.append(i)
🔹 예시 3 : list()
함수를 이용하는 방법
data = list(range(1,11))
🔹 예시 4 : 리스트 컴프리헨션
문법을 이용하는 방법
data = [i for i in range(1, 11)]
🖐️ 여기서 더 복잡해진다면..?
🔸 상황 2 : 위의 리스트에서 짝수 값(2,4,6,8,10)만 저장하고 싶을 때
🔹 예시 1 : 일반적인 for문
을 이용하는 방법
data = []
for i in range(1, 11):
if i % 2 == 0:
data.append(i)
🔹 예시 2 : 리스트 컴프리헨션
문법을 이용하는 방법
data = [i for i in range(1, 11) if i % 2 == 0]
🔸 상황 3
# 리스트 컴프리헨션
data = [(x, y) for x in range(1, 6) for y in range(1, 4)]
# for문
data2 = []
for i in range(1, 6):
for j in range(1, 4):
data2.append((i, j))
# 출력결과
[(1, 1), (1, 2), (1, 3),
(2, 1), (2, 2), (2, 3),
(3, 1), (3, 2), (3, 3),
(4, 1), (4, 2), (4, 3),
(5, 1), (5, 2), (5, 3)]
for문
앞에 키:값
을 적고, 대괄호 []
를 중괄호 {}
로 바뀐다.dict_variable = [expression for 변수 in iterable]
data = {i : i*2 for i in range(1, 6)}
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10}
name = ["짱구", "철수", "유리"]
age = [23, 14, 42]
data = {key: value for (key, value) in zip(name, age)}
{'짱구': 23, '철수': 14, '유리': 42}
물론 if문
을 활용할 수도 있다.
name = ["짱구", "철수", "유리"]
age = [23, 14, 42]
data = {key: value for (key, value) in zip(name, age) if value > 20}
{'짱구': 23, '유리': 42}
키:값
형태를 적지 않고, 중괄호 {}
를 쓴다.set_variable = [expression for 변수 in iterable]
data = {i for i in range(1, 11)}
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}