리스트 컴플리헨션 중첩!!!
저번에 List comprehension에 대해 배웠는데 ... view를 짜다가 List comprehension 을 중첩으로 사용해야할 것 같은 느낌이 들었다. List comprehension을 중첩으로 사용할 수 있는지 검색한 결과 중첩으로 사용이 가능했다.
new_list = []
for i in range(1,4):
for n in range(1,11):
new_list.append(i*n)
중첩된 for문을 List comprehension으로 만들면,
new_list = [i*n for i in range(1,4) for n in range(1,10)]
>>> print(new_list)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
처음 List comprehension을 접했을 때와 같이 혼...란... 했다. 그래서 조금 더 많은 예시를 찾아봤다.
>>> list = [[1,2,3],[4,5,6],[7,8,9]]
>>> flat = [x for row in list for x in row]
>>> print(flat)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
example1에서 각각 리스트에 제곱을 하는 리스트 컴플리헨션을 만들면,
>>> list = [[1,2,3],[4,5,6],[7,8,9]]
>>> result = [[x**2 for x in row] for row in list]
>>> print(result)
[[1, 4, 9], [16, 25, 36], [49, 64, 81]]
[ <<expression>> for <<element_a>> in <<iterable_a>> (optional if <<condition>>_a)
for <<element_b>> in <<iterable_b>> (optional if <<condition>>_b)
for <<element_c>> in <<iterable_c>> (optional if <<condition>>_c)
........]
List comprehension 중첩 제한은 없지만 표현식이 2개가 넘어가면 이해하기 어려워지므로 복잡해질 것 같으면 헬퍼 함수를 작성해주어야 한다고 한다. 몇 줄을 절약하는 것도 좋지만 다른 사람들이 이해하기 어려워지니까 적절하게 사용하는 것이 좋을 것 같다.