我获得了一维数字。
我需要通过数组添加每个连续元素以形成总和。一旦此总和达到某个值,它就形成了新数组的第一个元素。然后重置总和并重复该过程,从而迭代整个数组。
例如,如果给定: [1,3,4,5,2,5,3] 并要求最低金额为5, 新阵列将是: [8,5,7]
明显:[1 + 3 + 4,5,2 + 5]
然后我还需要记录元素组合方式的特定数组:我需要采用相同长度的不同数组,并以与上面相同的方式组合元素。
e.g。给阵列 [1,2,1,1,3,2,1] 我需要输出 [4,1,5]
明显:[1 + 2 + 1,1,3 + 2]
我用i循环和增量计数器完成了这个,但它非常难看。名为"记录"包含为了使新数组的每个元素相加而得到的旧元素的数量,即[3,1,2]
import numpy as np
def bin(array, min_sum):
num_points = len(array)
# Create empty output.
output = list()
record = list()
i = 0
while i < num_points:
sum = 0
j = 0
while sum < min_sum:
# Break out if it reaches end of data whilst in loop.
if i+j == num_points:
break
sum += array[i+j]
j += 1
output.append(sum)
record.append(j)
i += j
# The final data point does not reach the min sum.
del output[-1]
return output
if __name__ == "__main__":
array = [1, 3, 4, 5, 2, 5, 3]
print bin(array, 5)
答案 0 :(得分:1)
我建议你简单地浏览一下清单。将其添加到the_sum
之类的累加器(不要使用sum
,因为它是内置的),并且如果the_sum
达到高于min_sum
的数字,则添加它,并将the_sum
重置为零。像:
def bin(array, min_sum):
result = []
the_sum = 0
for elem in array:
the_sum += elem
if the_sum >= min_sum:
result.append(the_sum)
the_sum = 0
return result
累加器涉及的行以粗体显示。
我将其他数组与练习相同,但作为提示:使用额外的累加器和zip
同时迭代这两个数组。
答案 1 :(得分:1)
这是一个简单的解决方案。 which
计算布尔值列表,其中当累积元素等于或超过目标值时值为true,calc
使用此列表计算累积值。
def which(l, s):
w, a = [], 0
for e in l:
a += e
c = (a >= s)
w.append(c)
if c:
a = 0
return w
def calc(l, w):
a = 0
for (e, c) in zip(l, w):
a += e
if c:
yield a
a = 0
这是一个互动演示
>>> l1 = [1, 3, 4, 5, 2, 5, 3]
>>> w = which(l1, 5)
>>> w
[False, False, True, True, False, True, False]
>>> list(calc(l1, w))
[8, 5, 7]
>>> l2 = [1, 2, 1, 1, 3, 2, 1]
>>> list(calc(l2, w))
[4, 1, 5]
答案 2 :(得分:0)
你可以使用我在与扁平阵列长期斗争后发现的简短解决方案。
获得有限金额使用:
<button><a herf="#" onClick="myFunction('clk1','c1');">button</a></button>
<p id="clk1"></p>
..
<button><a herf="#" onClick="myFunction('clk1','c2');">button</a></button>
<p id="clk1"></p>
..
<button><a herf="#" onClick="myFunction('clk1','c3');">button</a></button>
<p id="clk1"></p>
输出:
<script>
var c = {c1: 0, c2: 0, c3: 0}
function myFunction(paragraph,varibl) {
c[varibl] = c[varibl] + 1
document.getElementById(paragraph).innerHTML = c[varibl];
}
</script>
要获取您的记录,请使用以下功能:
f = lambda a,x,j,l: 0 if j>=l else [a[i] for i in range(j,l) if sum(a[j:i])<x]
从这里,您可以获得两组记录和总和:
>>> f = lambda a,x,j,l: 0 if j>=l else [a[i] for i in range(j,l) if sum(a[j:i])< x]
>>> a= [1, 3, 4, 5, 2, 5, 3]
>>> f(a,5,0,7)
[1, 3, 4]
>>> sum(f(a,5,0,7))
8
>>> sum(f(a,5,3,7))
5
>>> sum(f(a,5,4,7))
7
>>>
现在,您甚至可以将它用作第二个向量的索引条件边界:
>>> y = lambda a,x,f,j,l: [] if j>=l else list(np.append(j,np.array(y(a,x,f,j+len(f(a,x,j,l)),l))))