초보 개발자

4강 리스트 컴프리헨션 본문

Python/윤성우 열혈 파이썬

4강 리스트 컴프리헨션

taehyeki 2021. 12. 15. 16:55

 

r1 = [1,2,3,4,5]
r2 = []
for i in r1:
    r2.append(i*2)
r2
[2,4,6,8,10]

리스트의 생성과 그 리스트의 채울 데이터를 가공 추출하는 일련의 과정들을 하나로 묶기 위해 존재하는 것이 리스트 컴프리헨션이다.

 

위의 과정들을 대폭 줄일 수 있다.

r2 = [x * 2 for x in r1]

먼저 []를 열어서 리스트라는 것을 알려주고

x는 for이 루프들 돌면서 받는 요소이다 

그 요소에 *2를 하여 반환하라는 의미이다 따라서 r1에 있는 요소들을 돌면서 새로운 리스트를 하나 만들것이다.

 

이번에 조건필터를 추가해보려고 한다.

r1 = [1,2,3,4,5]
r2 = []
for i in r1:
	if i % 2: 
    	r2.append(i*2)
r2
[2,6,10]

좀 전에 해봤던 것에 if문을 추가하였다. 이건 나머지가 0이 아니면 *2를 하라고 하여

홀수들*2인 리스트들이 출력이 된다 이 역시 리스트 컴프리헨션으로 가능하다

r2 = [x * 2 for x in r1 if x % 2]

너무 간단하지 않은가

r1의 값들을 하나씩 x에 넣어서,

x % 2가 True인지 확인하고,

True이면 x * 2를 리스트에 추가 한다.

 

for가 두번 들어간 리스트 컴프리헨션도 있다. 이 역시 간단하다.

r1 = ['Black', 'White']
r2 = ['Red', 'Blue', 'Green']
re = [t+p for t in r1 for p in r2 ] # 중첩돈 for 루프 형태의 리스트 컴프리헨션
r3
['BlackRed', 'BlackBlue', 'BlackGreen', 'WhiteRed', 'WhiteBlue', 'WhiteGreen']

각 요소 t와 p를 더하라는 것인데 먼저 for t in r1안에 for p in r2가 들어간다고 생각하자

따라서 t는 고정이고 for p루프가 다 돈뒤 그다음 t의 요소로 넘어가고 다시 for p 루프가 다 돈다.

즉 black(고정) red blue green(다 돌았음) white(고정) red blue green(다 돌았음) 끝

 

r = [n * m for n in range(2,10) for m in range(1,10)]
r
[2,4,6,8,10,12,14,16,18,3,6,9,12,15,18 ..... ]

이렇게 또 만들 수 있고 

이중 for 루프에 조건 필터까지 추가할 수있다.

r = [n * m for n in range(2,10) for m in range(1,10) if n * m % 2]
r
[3,9,15,21,27,5,15,25,35... ]

모든 n과 m을 조합해서 n* m의 결과가 2의 배수인 n과 m의 조합만을 가지고 n*m의 결과를 만들어서 리스트에 저장!

if 문을 마지막에 생각하자 이중 for문 먼저 돌고 그 결과값을 리스트에 넣기 전에 if에 확인하는 식으로 !!

 

처음에 이중 for안에 들어있는 for문에서 if를 검사하는 줄 알았는데 아니었다.