Python|前缀 Sum Subarray 直到 False 值
前缀数组在编程实践中非常有名。本文将讨论该方案的一种变体。这处理累积列表总和直到 False 值,并再次从 True 值的出现开始累积。让我们讨论可以执行此操作的某些方式。
方法#1:使用朴素方法
在朴素的方法中,我们只是构造了由 prev 的总和组成的新列表。 list 的值直到 0 并在遇到非零值时重新启动过程。
# 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]
方法 #2 : 使用from_iterable() + accumulate() + groupby()
上述三个功能结合在一起执行此特定任务。在此,accumulate函数执行添加元素的任务,groupby函数对非零值进行分组,结果由from_iterable
函数组合。
# 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]