#!/usr/bin/env python # coding: utf-8 # ## 28. 컴프리헨션 내부에 제어 하위 식을 세개 이상 사용하지 말라 # In[1]: matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] flat = [x for row in matrix for x in row] print(flat) # In[2]: squared = [[x**2 for x in row] for row in matrix] print(squared) # 만약 아래와 같은 경우 컴프리헨션 안에 다른 루프가 들어 있으면 코드가 너무 길어져 여러 줄로 나눠 써야 한다. # In[3]: my_lists = [ [[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]] ] # In[4]: flat = [x for sublist1 in my_lists for sublist2 in sublist1 for x in sublist2] # In[5]: flat # 풀어 쓰는게 더 명확하다 # In[8]: flat = [] for sublist1 in my_lists: for sublist2 in sublist1: flat.extend(sublist2) # In[9]: flat # 컴프리헨션은 if 조건을 허용한다 # # 여러 조건을 같은 수준의 루프에 사용하면 암시적으로 and 식을 의미한다. # In[10]: a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # In[13]: b = [x for x in a if x > 4 if x % 2 == 0] # In[14]: b # In[15]: c = [x for x in a if x > 4 and x % 2 == 0] # In[16]: c # In[17]: matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # In[18]: filtered = [[x for x in row if x % 3 ==0] for row in matrix if sum(row) >= 10] # In[19]: filtered # 컴프리헨션에 들어가는 하위식이 세개 이상 되지 않게 제한하라!! # # 즉 조건문 두개, 루프 두개 혹은 조건문 한개와 루프 한개를 사용하라 # ## 기억해야 할 내용 # - 컴프리헨션은 여러 수준의 루프를 지원하며 각 수준마다 여러 조건을 지원한다. # - 제어 하위 식이 세 개 이상인 컴프리헨션은 이해하기 매우 어려우므로 가능하면 피해야한다.