요새 출제 하느라 정신이 하나도 없네요. 몇 일 동안 글을 쓰지 못했네요. 이번에는 itertools의 accumulate에 대해 간단하게 알아보도록 하겠습니다.

 


 설명을 보면, series of accumulated sums 이라고 되어 있긴 합니다. 여기서 accumulate는 축적하다라는 뜻인데요. 뒤에 d가 붙었으니 축적된이겠죠? sums가 뒤에 붙었는데요. 축적된 합. 네. 누적합을 구하게 됩니다. 그런데 뒤에 괄호를 보면, or other binary 함수 results라고 되어 있어요.

 

 무엇인지는 모르겠지만 대충 직역하면 다른 conversion의 결과를 누적한다. 이 정도로 해석하면 좋겠네요. 축적된 합은 몰라도, 누적합, 누적 곱 정도는 많이 들어보셨으리라 생각해요. 예제 몇 개를 봅시다.

 

 

 iterable한 list를 넣었습니다. 리스트에는 1, 3, 5, 3, 1, 6이 있었는데요. iter를 돌면서 누적된 합을 구합니다. 결과를 보겠습니다.

 

 

 1, 4, 9, 12, 13, 19. 정확하게 누적된 합을 구했음을 알 수 있어요.

 

 

 이번에는 func에 max를 넣었습니다. 이건 두 수 중에 최댓값을 구하는 함수입니다. 누적 최댓값. 무엇을 의미할까요? 구간 [0, i)에서의 최댓값을 구하는 것과 같나요? 결과를 한 번 봅시다.

 

 

 1, 3, 5, 5, 5, 6이 순서대로 나왔네요. 3번째 값에 5가 나온 것은 1, 3, 5의 최댓값이 5이기 때문입니다. 4번째도 5가 나왔는데요. 당연하게도 1, 3, 5, 3의 최댓값이 5이기 때문입니다. 기존에 누적된 값과 새로운 값을 max 해서 나온 결과를 새롭게 누적시킨 게 됩니다.

 


 내가 func을 직접 만들 수도 있을까요? 누적을 시키는 함수를? 가능합니다. 아래의 코드를 보겠습니다.

 

 select(a, b)가 있습니다. 딱히 어렵지 않고요. a와 b는 tuple로 들어옵니다. ta가 (a[1], a[0])이고 tb가 (b[1], b[0])일 때, ta가 tb보다 같거나 크면 a를 리턴하고, 그렇지 않으면 b를 리턴합니다. 2개의 인자를 받는 것도 주목할 필요가 있습니다.

 

 

 이제 func에 select를 적어주겠습니다. 결과가 어떻게 나왔을까요?

 

 

 요래 나왔네요. tuple에서 뒤에 값이 큰 놈, 뒤에 값이 같으면 앞에 값이 큰 순으로 들어갔는데요. (1, 3)과 (2, 5) 중에서 하나를 select 하면 (2, 5)입니다. 왜냐하면 3 < 5이기 때문입니다. 그리고 (2, 5)와 (1, 7)이 넘어왔을 때 (1, 7)의 뒤의 값이 (2, 5)의 뒷 값보다 크기 때문에 (1, 7)이 선택됩니다.

 

 이런 식으로 select 변환을 적용하다 보면, 7개를 다 돌았을 때, 누적된 결과는 (1, 7)이 나오게 됩니다.

 

 

 initial은 초기값을 설정할 수 있습니다. li에 1, 2, 3, 4가 순서대로 있습니다. 초기값이 10이니까 10부터 시작하는데요. 처음에 10에 1을 더하므로 11이 됩니다. 누적된 결과 11에서 다시 2를 더하므로 13이 됩니다. 그 다음에는 13에 3을 더하므로 16, 그 다음에는 20이 됩니다.

 

 

 결과는 위와 같습니다.