리스트에서 특정 위치의 요소가 그 앞에 있는 여러 요소들의 합과 같은 값을 갖는 누적 합(cumulative sum)을 구해야 하는 경우가 있습니다. 예를 들어 [10, 20, 25, 30, 40, 50]이라는 리스트의 누적 합은 [10, 30, 55, 85, 125, 175]가 됩니다. 이런 연산은 통계 분석, 재무 데이터 처리 등 다양한 분야에서 유용하게 활용됩니다.
이럴 때 리스트를 매개변수로 받는 함수를 정의하고, 리스트 컴프리헨션(list comprehension)을 활용하면 누적 합을 손쉽게 계산할 수 있습니다.
예제 코드
def cumulative_sum(my_list):
cumulative_list = []
my_length = len(my_list)
cumulative_list = [sum(my_list[0:x:1]) for x in range(0, my_length+1)]
return cumulative_list[1:]
my_list = [10, 20, 25, 30, 40, 50]
print("The list is :")
print(my_list)
print("The cumulative sum is :")
print(cumulative_sum(my_list))실행 결과
The list is : [10, 20, 25, 30, 40, 50] The cumulative sum is : [10, 30, 55, 85, 125, 175]
코드 설명
누적 합을 계산하는 함수를 정의하고, 리스트를 매개변수로 전달받습니다.
결과를 저장할 빈 리스트를 먼저 선언합니다.
len() 함수를 사용해 입력 리스트의 길이를 구합니다.
리스트 컴프리헨션을 통해 0부터 리스트 길이+1까지 반복하면서, 각 단계마다 my_list[0:x] 슬라이스의 합을 계산합니다.
range()가 0부터 시작하기 때문에 첫 번째 계산값은 빈 슬라이스의 합인 0이 됩니다. 따라서 [1:] 슬라이싱으로 이 값을 제외하고, 실제 의미 있는 누적 합만 반환합니다.
함수 외부에서 원본 리스트를 정의하고 콘솔에 출력합니다.
cumulative_sum() 함수를 호출하여 리스트를 매개변수로 전달하고, 그 결과를 출력합니다.
더 나은 방법: itertools.accumulate 활용
위 방식은 반복할 때마다 슬라이스와 sum()을 다시 계산하므로 시간 복잡도가 O(n²)입니다. 리스트가 클 경우 비효율적일 수 있으며, 이때는 파이썬 표준 라이브러리의 itertools.accumulate를 사용하는 것이 좋습니다.
from itertools import accumulate my_list = [10, 20, 25, 30, 40, 50] result = list(accumulate(my_list)) print(result)
[10, 30, 55, 85, 125, 175]
accumulate는 한 번의 순회(O(n))로 동일한 결과를 얻을 수 있어 성능 면에서 훨씬 효율적입니다. 간단한 학습용 구현에는 리스트 컴프리헨션 방식이 적합하고, 실제 프로덕션 코드에는 itertools를 사용하는 것을 권장합니다.