본문 바로가기
Python/Basic

[Python] Comprehension (List, Dictionary Comprehension)

by Mr.Han 2024. 8. 26.

[1] Comprehension이란?

파이썬의 자료구조에 데이터를 좀 더 효율적이고 간결하게 표현하기 위한 문법

 

[2] List Comprehension

1) 작성 방법

[표현식 for 항목 in 반복가능객체 if 조건문]

 

 

- 기존의 For 반복문을 이용한 방법과 List Comprehension을 이용한 방법의 차이

>>>
# 기존
ls = []
for i in range(1, 5):
    ls.append(i)
print(ls)

# list comprehension
ls = [i for i in range(1, 5)]
print(ls)

 

# Output

[1, 2, 3, 4]

 

 

- 표현식과 조건문을 추가하여 사용 가능

>>>
# 기존
ls = []
for i in range(1, 5):
    if i % 2 == 0:
        ls.append(i * 4)
print(ls) 

# list comprehension
ls = [i * 4 for i in range(1, 5) if i % 2 == 0]
print(ls)

 

# Output
[8, 16]

 

 

2) For문을 여러 개 사용하는 것도 가능

[표현식 for 항목1 in 반복가능객체1 if 조건문1
    for 항목2 in 반복가능객체2 if 조건문2
    ...
]

 

 

- 구구단

>>>
# 기존
gugudan = []
for i in range(2, 10):
    for j in range(1, 10):
        gugudan.append(i*j)
print(gugudan)

# list comprehension
gugudan = [i * j for i in range(2, 10) for j in range(1, 10)]
print(gugudan)

 

# Output
[2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]

 

 

[3] Dictionary Comprehension

1) 작성 방법

- 기존의 For 반복문을 이용한 방법과 List Comprehension을 이용한 방법의 차이

>>>
# 기존
names = ['Merry', 'John', 'Chris']
num = [1, 2, 3]

dic = {}
for i in range(len(names)):
    dic[names[i]] = num[i]
print(dic)

# dict comprehension
names = ['Merry', 'John', 'Chris']
num = [1, 2, 3]

dic = {names[i]:num[i] for i in range(len(names))}
print(dic)

# 기존 (zip)
names = ['Merry', 'John', 'Chris']
num = [1, 2, 3]

dic = {}
for k, v in zip(names, num):
    dic[k] = v
print(dic)

# dic comprehension (zip)
names = ['Merry', 'John', 'Chris']
num = [1, 2, 3]

dic = {k:v for k, v in zip(names, num)}
print(dic)
# Output
{'Merry': 1, 'John': 2, 'Chris': 3}

 

- 표현식과 조건문을 추가하여 사용 가능

>>>
names = ['Merry', 'John', 'Chris']
num = [1, 2, 3]

dic = {k:v*5 for k, v in zip(names, num) if v % 2 == 1}
print(dic)

 

# Output
{'Merry': 5, 'Chris': 15}

 


[4] 연습문제

 

문제 1)
1부터 1000까지 5의 배수의 합을 list comprehension을 통해 구해보시오.
>>>
# 기존
sum_list = []

for i in range(1, 1001):
    if i % 5 == 0:
        sum_list.append(i)

print(sum(sum_list))

# list comprehension
sum_list_sum = sum([i for i in range(1, 1001) if i % 5 == 0])
print(sum_list_sum)

 

# Output
100500

 

문제 2)
다음 딕셔너리의 키와 값을 바꾸어 출력해보세요. (값을 키로, 키를 값으로)
id_name = {1: 'Merry', 2: 'John', 3: 'Chris'}

 

>>>
# 기존
reverse_dic = {}

for k, v in id_name.items():
    reverse_dic[v] = k
    
print(reverse_dic)

# dict comprehension
reverse_dic = {v:k for k, v in id_name.items()}
print(reverse_dic)

 

# Output
{'Merry': 1, 'John': 2, 'Chris': 3}

 

문제 3)
- 다음 리스트는 리스트 안에 리스트가 들어있습니다. 리스트 안의 리스트를 하나의 리스트로 만들어보시오.
ohlc = [[100, 110, 70, 100],
        [200, 210, 180, 190],
        [300, 310, 300, 310]]

 

>>>
# 기존
ls = []

for i in ohlc:
    for j in i:
        ls.append(j)

print(ls)

# list comprehension
ls = [j for i in ohlc for j in i]
print(ls)

 

# Output
[100, 110, 70, 100, 200, 210, 180, 190, 300, 310, 300, 310]

 

문제 4.
다음 리스트의 요소의 빈도값을 dict comprehension을 사용하여 딕셔너리로 출력해보세요.
x = ['a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'c']

 

>>>
# 기존
dic = {}

for i in set(x): # 중복 제거
    dic[i] = x.count(i)

print(dic)

# dict comprehension
dic = {i:x.count(i) for i in set(x)}
print(dic)

 

# Output
{'a': 2, 'b': 3, 'c': 4}