- 내일배움캠프 32일차 목차
[오늘 한일]
- 알고리즘 문제풀이
- 장고심화 개인과제 마무리
- 장고 심화강의 수강
- OOP 특강 수강
[오늘 배운점]
알고리즘 문제를 풀으며 배운점을 적겠다.
특강에서 배운점은 주말 배운점에 적겠다.
<리스트 컴프리헨션안에서 리스트 컴프리헨션>
오늘 '행렬의 덧셈' 문제에서 만난 상황이였다.
리스트 컴프리헨션을 선언하며 그안에서 리스트 컴프리헨션을 할수 있을까?
즉, 이중 리스트를 만들수 있을지 궁금했다.
주어지는 입력은 [[1, 2], [2, 3]], [[3, 4], [5, 6]] 이렇게 두개의 이중 리스트이고,
기대되는 출력은 [[4, 6], [7, 9]] 각 위치끼리 더해진 이중 리스트이다.
입력 리스트의 행과 열의 길이는 달라질수 있는 요소이다.
그렇기 때문에 행, 열 길이를 참고하는 반복으로 리스트를 작성하게 해야한다.
그래서 리스트 컴프리헨션이 적합하다고 생각되었지만,
위에 적은대로 컴프리헨션 안에서 컴프리헨션이 되는지 몰랐기에,
우선 반복문으로 원하는 동작대로 작성했다.
def solution(arr1, arr2):
answer = []
for x in range(len(arr1)):
templist = []
for y in range(len(arr1[0])):
templist.append(arr1[x][y]+arr2[x][y])
answer.append(templist)
return answer #[[4, 6], [7, 9]]
이렇게 말그대로, 행 길이와 열 길이를 참고하며,
행열 안에서 두 리스트의 요소끼리 더한 값들을 리스트로 만들어,
answer리스트에 작성되도록 만들었고, 결과가 잘 나왔다.
잘 되는걸 봤으니 이제 리스트 컴프리헨션으로 도전할 차례였다.
고민스러운 부분은 바깥 리스트에서 참고할 행길이(x)를 안쪽에서도 가져다 쓸수 있냐였는데,
흥미롭게도 잘 가져다가 쓴다.
그래서 생각한대로 아래처럼 작성했을때 잘 동작하였다.
def solution1(arr1, arr2):
answer = [[arr1[x][y]+arr2[x][y]
for y in range(len(arr1[0]))] for x in range(len(arr1))]
return answer #[[4, 6], [7, 9]]
진짜 형태가, 위의 반복문을 그대로 리스트 컴프리헨션으로 작성한 것처럼 되었다.
이렇게 작성했을때 바깥 컴프리헨션의 요소부분인 안쪽 컴프리헨션은,
바깥 컴프리헨션의 x를 잘 참조한다.
(마치 상위 반복문의 x를 하위 반복문에서 잘 가져다가 쓰는것과 같다.)
결론, 리스트 컴프리헨션 안에서 리스트 컴프리헨션은 사용이 잘되며,
바깥 컴프리헨션의 변수를 잘 참조한다.
그러나 한줄에 많은 단계가 함축되어서 한편으로는 간결하지만,
한편으론 보고 이해하기 어렵기도 하다.
내가 원하는 간결함은,
불필요한 부분이 없으면서 스텝마다 한줄로 나누어져,
동작이 한눈에 보이는 것이다.
어쨌든 상황에 따라 활용할 수 있을것 같다.