이번 시간에는 파이썬의 list comprehensions에 대해 알아봅시다. list를 간단하게 초기화 할 수 있는 방법입니다.

 


 먼저 예제 3개를 보도록 하겠습니다. 예제 1번입니다.

 

 [k for k in range(10)]이 있네요. 뒤에서부터 해석해 봅시다. 일단 for K in A를 먼저 봐야 하는데요. A가 range(10)이였습니다. 게다가, range는 iterable 해요. 그러면, K의 값은 0부터 9까지 된다는 의미인데요. for 앞에 K가 붙어 있어요. 그러면 K값이 list의 원소가 된다는 의미입니다.

 

그러면, list에 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]가 나와야 할 텐데요. 정말 그렇게 나왔나 볼까요?

 

 정말 그렇게 나왔습니다. 이제 필터링을 해 보겠습니다.

 

 

 아까와는 똑같은데요. 뒤에 if가 붙었어요. 일단 k는 0부터 9까지 돌 겁니다. 그리고 이들이 그대로 list에 추가될 겁니다. filtering을 하는 if절이 없다면요. 뒤에 if 절이 붙었는데요. k % 2 == 0인 경우에만 리스트에 들어가겠다는 의미입니다. k % 2가 0이라면, 짝수인 경우를 의미합니다.

 

 따라서, 1, 3, 5, 7, 9는 filtering이 되고, 리스트에는 [0, 2, 4, 6, 8]만 들어가게 됩니다. 필터링 조건이라고 이해하시면 좋겠습니다.

 

 

 결과는 위와 같습니다.

 

 

 이제 3번째 예제를 보겠습니다. 조금 더 어려운데요. 천천히 봅시다. 일단 for k in range(10)을 보시면, k가 0부터 9까지 돈다는 것을 의미합니다. 그런데, 뒤에 if문이 붙었어요. 그러면, k가 0부터 9까지 도는 건 맞는데, k % 2가 0인 경우에만 append가 된다는 의미입니다. 이 경우는 k가 0, 2, 4, 6, 8입니다.

 

 이제 for loop 앞에 있는 k**2를 볼 건데요. 이것은 k의 제곱을 의미합니다. 문서에서는 표현식이 평가된다는 표현을 썼는데요. k가 0부터 9까지 돌았는데, 이 중에 짝수인 것만 필터링을 거치면 0, 2, 4, 6, 8이에요. k가 0, 2, 4, 6, 8이라는 의미입니다. 이 때, for 앞에 붙어 있는 식 k**2는 어떻게 되나요? 0, 4, 16, 36, 64가 됩니다. 즉, k가 0, 2, 4, 6, 8일 때, k**2가 각각 0, 4, 16, 36, 64로 평가가 되었고, 이들이 list를 초기화 하기 위해 쓰였습니다.

 

 

 따라서 list는 아래와 같이 초기화가 됩니다.

 

 예제 3은 위 프로그램과 같습니다. if절이 3번째 if문, for문 앞에 있는 if가 4번째 줄과 같다고 보시면 됩니다.

 


 이제 조금 복잡한 예제를 볼게요.

 

 for가 2개 들어가서 복잡해 보이는데요. 어렵지 않습니다. 먼저 for x in range(0, 5)는 x가 0부터 4까지 돈다는 의미입니다. 그 다음에 for문이 또 이어지는데요. for y in range(0, 5)는 y가 0부터 4까지 또 돈다는 의미인데요. y가 있는 for loop는 x가 있는 for loop의 이너 루프로 작동합니다.

 

 그러면, x가 0이고 y가 0인 경우부터, x가 4이고 y가 4인 경우까지 나올 겁니다. 이 중에서 x < y인 (x, y)인 것들을 li에 초기화 item으로 쓰겠다는 의미에요.

 

 실행 결과는 다음과 같습니다. 그런데, tuple의 길이가 2이긴 한데, for가 2번이나 나오니 좀 그렇습니다. 좋은 방법이 없을까요?

 

 1번째 인자로 iterable을 받는데요. range(5)는 0부터 4까지를 의미합니다. 그리고, r = 2라는 의미는 2개를 뽑는다는 의미입니다. 조합은 순서 고려하는 것입니다. 그리고 앞에 것을 뒤에 것 보다는 먼저 뽑으니, 사실상 combinations에서 뽑히는 tuple은 앞에 있는 것이 뒤에 있는 것 보다는 작을 겁니다.

 

 결과는 위와 같습니다. itertools는 코딩 테스트에서 생각보다 자주 쓰일 수 있으니, 익혀두시면 좋겠습니다.