2017-02-26 177 views
2

我必須在Python中編寫一個函數,輸出數組中3個連續數字的總和,例如,如果數組具有以下值:[10, 20, 30, 40, 50]它應該添加前3個數字(10 + 20 + 30)然後(20 + 30 + 40)然後(30 + 40 + 50)依此類推,直到50是最後一個數值。查找數組中的3個連續數字的總和

我的代碼添加所有的號碼如下:

def sum_interval(values, start, stop): 
    N = len(values) 
    terms = np.zeros(N) 

    for i in np.arange(start, stop + 1, 1): 
     terms[i] = values[i] 

     ans = np.sum(terms) 

    return ans 

arr = np.array([10, 20, 30, 40, 50]) 
print(sum_interval(arr, 2, 4)) 

此以下函數使用上述sum_interval定義來計算3張連續的數的總和:

def sum_triplets(values): 
    N = len(values) 
    terms = np.zeros(N) 

    for i in range(0, N, 1): 
     terms[i] = sum_interval(values, i, N-1) 

    return terms 

arr = np.array([10, 20, 30, 40, 50]) 
print(sum_triplets(arr)) 

預期產出:[60, 90, 120, 90, 50]

我得到的輸出:[150, 140, 120, 90, 50]

回答

0

sum_triplets功能,替換下面的行:

terms[i] = sum_interval(values, i, N-1)

terms[i] = sum_interval(values, i, min(N-1,i+2))

+0

非常感謝。這幫助了很多 –

3

我不明白你爲什麼弄得這麼複雜:你可以簡單地使用切片

def sum_triplets(values): 
    result = [] 
    for i in range(len(values)): 
     result.append(sum(values[i:i+3])) 
    return result

(添加的切片部分黑體字)

你甚至可以把這個在一個一個班輪列表理解

def sum_triplets(values): 
    return [sum(values[i:i+3]) for i in range(len(values))] 
+4

我已經採取了用在你的答案粗體不時, 那謝謝啦!非常好的突出事情。 – miradulo

+2

是的,粗體字是獨特的(y) – ZdaR

+0

非常感謝你,它真的幫了我很多:) @Willem –

5

如果您已經在使用數組,那麼您不妨選擇一個簡單的NumPy解決方案。一種方法是使用np.convolve來通過您的輸入數組對您想要的窗口大小的數組進行乘法和求和。

np.convolve(arr, np.ones(3, dtype=np.int), mode='valid') 

演示

>>> arr 
array([10, 20, 30, 40, 50]) 

>>> np.convolve(arr, np.ones(3, dtype=np.int), mode='valid') 
array([ 60, 90, 120]) 

如果你使用一個Python的解決方案集,你應該避免在當前的方法中,中間陣列存儲 - 威廉已經爲你披上了漂亮的在這種情況下回答。

-1
array = [10, 20, 30, 40, 50] 
length = len(array) 

n = 0 
while n < length: 
    m = n 
    if m < length: 
     first = array[n] 
    if m+1 < length: 
     second = array[m+1] 
    else: 
     second = 0 
    if m+2 < length: 
     third = array[m+2] 
    else: 
     third = 0 
    result = first + second + third 
    n = n+1 
    print result