Python | Prefix Sum Subarray till False value
The prefix array is quite famous in the programming practice. This article would discuss a variation of this scheme. This deals with the cumulative list sum till a False value, and again starts cumulation from the occurrence of True value. Let’s discuss certain ways in which this can be performed.
Method #1 : Using Naive Method
In the naive method, we just construct the new list comprising of the summation of prev. value of list until 0 and restarts the procedure once a non-zero value is encountered.
# Python3 code to demonstrate # Prefix Sum Subarray till False value # using naive method # initializing list of lists test_list = [ 1 , 3 , 4 , 0 , 4 , 5 , 0 , 7 , 8 ] # printing original list print ( "The original list is : " + str (test_list)) # Prefix Sum Subarray till False value # using naive method for i in range ( 1 , len (test_list)): if test_list[i]: test_list[i] + = test_list[i - 1 ] # printing result print ( "The computed modified new list : " + str (test_list)) |
The original list is : [1, 3, 4, 0, 4, 5, 0, 7, 8] The computed modified new list : [1, 4, 8, 0, 4, 9, 0, 7, 15]
Method #2 : Using from_iterable() + accumulate() + groupby()
The above three functions combine together to perform this particular task. In this, the accumulate function performs the task of addition of elements, groupby function groups the non-zero values and the result is combined by the from_iterable
function.
# Python3 code to demonstrate # Prefix Sum Subarray till False value # from_iterable() + accumulate() + groupby() from itertools import groupby, accumulate, chain # initializing list of lists test_list = [ 1 , 3 , 4 , 0 , 4 , 5 , 0 , 7 , 8 ] # printing original list print ( "The original list is : " + str (test_list)) # Prefix Sum Subarray till False value # from_iterable() + accumulate() + groupby() res = list (chain.from_iterable(accumulate(j) for i, j in groupby(test_list, bool ))) # printing result print ( "The computed modified new list : " + str (res)) |
The original list is : [1, 3, 4, 0, 4, 5, 0, 7, 8] The computed modified new list : [1, 4, 8, 0, 4, 9, 0, 7, 15]