我正在寻找一种使用 Total 函数和阈值参数来减少巨大列表长度的方法。我想避免使用 For 和 If (来自旧习惯)。
示例:我想“减少”{1,5,3,8,11,3,4}
的列表:阈值为5
.
我想要的输出:{6,11,11,7}
这意味着我在列表的第一部分使用 Total 函数并查看该函数的结果是否高于我的阈值。如果是这样,我使用 Total 函数的结果并转到列表的下一部分。
另一个例子是{1,1,1,1,1}
阈值为5
。结果应该是{5}
。
谢谢!
编辑:它正在工作,但速度很慢。有什么想法可以更快吗?
编辑2:循环的东西(退出简单而不聪明)
For[i = 1, i < Length[mylist] + 1, i++,
sum = sum + mylist[[i]];
If[sum > Threshold ,
result = Append[result , sum]; sum = 0; ]; ];
编辑3:我现在有一件新事情要做。我现在必须使用 2D 列表,例如{{1,2}{4,9}{1,3}{0,5}{7,3}}
它或多或少是相同的想法,但列表的第一和第二部分必须高于阈值(两者)。示例:If lst[[1]] and lst[[2]] > threshold do the summuation
对于 2D 列表的每个部分。我试图将 Mr.Wizard 的 f2 函数用于这种情况,但我没有成功。如果更简单,我可以提供 2 个独立列表并使用此输入f3[lst1_,lst2_,thres_]:=
Reap[Sow@Fold[If[Element of the lst1 > thr && Element of the lst2, Sow@#; #2, # + #2] &, 0, lst1]][[2, 1]]
。
编辑4:你是对的,这不是很清楚。但是该Min@# > thr
语句的使用效果很好。
旧代码(丑陋而且一点也不聪明):
sumP = 0;
resP = {};
sumU = 0;
resU = {};
For[i = 1, i < Length[list1 + 1, i++,
sumP = sumP + list1[[i]];
sumU = sumU + list2[[i]];
If[sumP > 5 && sumU > 5 ,
resP = Append[resP, sumP]; sumP = 0;
resU = Append[resU, sumU]; sumU = 0;
];
]
向导先生的新快速:
f6[lst_, thr_] :=
Reap[Sow@Fold[If[Min@# > thr , Sow@#1; #2, #1 + #2] &, 0, lst]][[2,
1]]
这大约快 40 倍。非常感谢。
Thread[{resP, resU}] == f6[Thread[{list1,list2}], 5] True