matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [x for row in matrix for x in row]
print(flat)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
squared = [[x**2 for x in row] for row in matrix]
print(squared)
[[1, 4, 9], [16, 25, 36], [49, 64, 81]]
만약 아래와 같은 경우 컴프리헨션 안에 다른 루프가 들어 있으면 코드가 너무 길어져 여러 줄로 나눠 써야 한다.
my_lists = [
[[1, 2, 3], [4, 5, 6]],
[[7, 8, 9], [10, 11, 12]]
]
flat = [x for sublist1 in my_lists
for sublist2 in sublist1
for x in sublist2]
flat
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
풀어 쓰는게 더 명확하다
flat = []
for sublist1 in my_lists:
for sublist2 in sublist1:
flat.extend(sublist2)
flat
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
컴프리헨션은 if 조건을 허용한다
여러 조건을 같은 수준의 루프에 사용하면 암시적으로 and 식을 의미한다.
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [x for x in a if x > 4 if x % 2 == 0]
b
[6, 8, 10]
c = [x for x in a if x > 4 and x % 2 == 0]
c
[6, 8, 10]
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
filtered = [[x for x in row if x % 3 ==0]
for row in matrix if sum(row) >= 10]
filtered
[[6], [9]]
컴프리헨션에 들어가는 하위식이 세개 이상 되지 않게 제한하라!!
즉 조건문 두개, 루프 두개 혹은 조건문 한개와 루프 한개를 사용하라