Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 리스트 누적 합 구하기 – i번째 요소가 첫 i+1개 요소의 합이 되도록 계산

리스트에서 특정 위치의 요소가 그 앞에 있는 여러 요소들의 합과 같은 값을 갖는 누적 합(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를 사용하는 것을 권장합니다.