现在,我有一个像这样的数组:
arr = np.array([[1, 300], [2, 100],[3, 0],[4, 0],[5, 50],[6, 100]])
我的问题是分别添加数组 300+100+0+0+50+100 但条件是按顺序求和,直到结果为 150。所以,我想知道如何从 [1 中跳过 arr=300 的 sum , 300] 然后 python 求和直到满足 [2, 100] 和 [5, 50] 为 100+50,然后将这两个数组收集在同一个变量中。你能推荐我扩展我的编码吗?谢谢
d = 0
for i in range(len(arr)):
if d >= 150:
break
d += arr[i][1]
i=i+1
如果您正在寻找总和达到目标值(150)的连续索引,您可以构建一个返回其索引的累积总和字典。然后将其本身与目标进行匹配,作为累积和之间的增量。匹配的键将为您提供范围:
arr = [300,100,0,0,50,100]
target = 150
from itertools import accumulate
sumIndex = {s:i for i,s in enumerate(accumulate([0]+arr)) }
targetRanges = [ (i,sumIndex[s+target]) for s,i in sumIndex.items()
if s+target in sumIndex ]
for start,stop in targetRanges:
print(start,stop,arr[start:stop])
1 5 [100, 0, 0, 50]
4 6 [50, 100]
它也可以在没有 itertools 的情况下在单个(复杂的)字典理解中完成:
ranges = [ (d[d[""]-target],i) for d in [{0:0,"":0}]
for i,a in enumerate(arr,1)
if d.update([(d[""]+a,i),("",d[""]+a)]) or d[""]-target in d ]