Story 04 리스트 컴프리헨션

유동헌·2021년 9월 26일
0

열혈파이썬_중급

목록 보기
4/8

리스트 생성 방법

먼저 리스트를 생성하는 기본 방법들을 정리해보겠다.

r1 = []
r2 = [1,2,3]
r3 = [1,2,[3,4]]
r4 = list("hello"]
r5 = list((5,6,7))
r6 = list(range(0,5))

단순 리스트는 위와 같은 방법으로 충분히 만들 수 있다. 그러나 조건이 복잡한 리스트들, 예를 들어서 아래 요구 조건의 리스트를 만들 떄는,

[1,2,3,4,5]의 모든 값을 두 배씩 증가시킨 값을 지니는 리스트를 만들어라 

r1 = [1,2,3,4,5]

r2 = []

for i in r1:
    r2.append(i * 2)
    
print(r2)

# [2, 4, 6, 8, 10]

이렇게 만들 수가 있다.

그런데 위의 코드를 다음과 같이 for loop를 사용하지 않는 형태로 대신할 수 있다. 그리고 이 것을 가리켜 리스트 컴프리헨션이라고 한다.

# 1
r1 = [1,2,3,4,5]

r2 = [i * 2 for i in r1]

print(r2)

#
[2, 4, 6, 8, 10]

# 2
r3 = [i + 10 for i in range(1, 10+1, 2)]

print(r3)

#
[11, 13, 15, 17, 19]

조건 필터 추가하기

다음 코드를 보자. 이는 for loop를 기반으로 리스트를 생성하는 예이다. 그런데. 리스트에 담을 값을 걸러내는 조건이 존재한다.

r1 = [1,2,3,4,5]

r2 = []

for i in r1:
    if i % 2:
        r2.append(i * 2)
print(r2)

# 
[2, 6, 10]

그런데 위의 코드는 리스트 컴프리헨션을 기반으로 다음과 같이 간단하게 작성할 수 있다.

r1 = [1,2,3,4,5]
r3 = [i * 2 for i in r1 if i % 2]
print(r3)

# 
[2, 6, 10]

리스트 컴프리헨션에 for 한번 더 들어가는 경우

다음과 같이 옷의 상의와 하의의 색상 정보를 갖는 리스트가 각각 존재하는 상황에서 만들 수 있는 모든 조합의 색을 값으로 담는 리스트를 만들고자 한다.

r1 = ['black', 'white'] # 상의
r2 = ['red', 'blue', 'green'] # 하의

r3 = []

for t in r1:
    for p in r2:
        r3.append(t + p)
print(r3)
# 
[
'blackred', 
'blackblue', 
'blackgreen', 
'whitered', 
'whiteblue', 
'whitegreen'
]
  • 리스트 컴프리헨션
r4 = [t + p for t in r1 for p in r2]

print(r4)
# 
[
'blackred', 
'blackblue', 
'blackgreen', 
'whitered', 
'whiteblue', 
'whitegreen'
]

예를 하나 더 들겠다. 이번에는 구구단의 모든 결과를 리스트에 담아보겠다. 즉 2단부터 9단까지 다음 내용이 리스트에 모두 담겨 다음 형태의 리스트가 만들어져야 한다.

r5 = [i * j for i in range(2, 10) for j in range(1, 10)]
print(r5)
# 
[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]

이중 for loop에 조건 필터 추가

r6 = [i * j for i in range(2, 10) for j in range(1, 10) if (i * j) % 2 == 0]
print(r6)

#
[2, 4, 6, 8, 10, 12, 14, 16, 18, 
6, 12, 18, 24, 
4, 8, 12, 16, 20, 24, 28, 32, 36, 
10, 20, 30, 40, 6, 12, 18, 24, 30, 
36, 42, 48, 54, 14, 28, 42, 56, 
8, 16, 24, 32, 40, 48, 56, 64, 72, 18, 36, 54, 72]
profile
지뢰찾기 개발자

0개의 댓글