2016-12-25 31 views
0

這個想法是爲每個數字添加下一個連續數字以嘗試達到目標值。如果對於每個起始值(對於我...)如果添加下一個連續數字超過目標,那麼我已經失敗並轉移到下一個。將列表中的連續值添加到目標值

我得到一些值滑倒和一些重複。

如果目標有意匹配它的工作正常的列表;我注意到有13個怪異的行爲。

def addToTarget (mylist, target): 

    solutions_list = [] 

    for i in range(0,len(mylist)): 

    #set base values 
    total = mylist[i] 
    counter = i 
    solutions = [] 


    solutions.append(total) 

    if total == target: 
     solutions_list.append(solutions) # first value matches immediately 

    elif total > target: 
     solutions_list.append([counter-1, "first value already too high"]) 

    elif counter == (len(mylist)): 
     solutions_list.append("caught as final value ") 

    while total < target and counter < (len(mylist)-1): 
     counter +=1 
     value = mylist[counter] 
     total += value 
     solutions.append(value) 

     if total == target: 
      solutions_list.append([counter, solutions]) 

     elif total > target: 
      solutions_list.append([counter-1, "total > target during"]) 

     elif counter == (len(mylist)-1): 
      solutions_list.append([counter-1, "total < target - came to end of list "]) 

     else : solutions_list.append([counter-1, "not sure but certian values seem to slip through"]) 

return solutions_list 

mylist = [5, 5, 3, 10, 2, 8, 10] 
solutions_list = [] 
test = answer(mylist, 13) 

for i in test : print(i) 
+4

可以添加你的預期輸出? –

+0

根據所列的名單和13我的目標期望答案= [[5,5,3],失敗,[3,10],失敗,失敗,失敗,失敗] – Jup

+0

我已經添加了計數器號碼到輸出看到,在這種情況下,在索引2處有多個條目,在索引0和1處沒有條目,在索引5處有兩個條目。我嘗試跟蹤這些值(我在火車上也有幾個啤酒...但是我有點笨拙,我敢肯定它有些愚蠢和簡單(又名非常討厭) – Jup

回答

1

您可以使用兩個標記來移動列表並跟蹤它們之間的值之和。雖然當前總和小於目標值(13),並且第一個標記不在列表的末尾,但會將其向前移動併爲當前總和添加值。移動第一個標記後,檢查當前總和是否與目標匹配並相應更新結果。在最後一步中,將第二個標記向前移動一步,並從當前總和中減去它指向的項目。

l = [5, 5, 3, 10, 2, 8, 10] 
TARGET = 13 
res = [] 
end = 0 
current = 0 

for start in range(len(l)): 
    while current < TARGET and end < len(l): 
     current += l[end] 
     end += 1 

    res.append(l[start:end] if current == TARGET else 'fail') 

    current -= l[start] 

print(res) 

輸出:

[[5, 5, 3], 'fail', [3, 10], 'fail', 'fail', 'fail', 'fail'] 
+0

這是非常好的 – Jup

0

你的代碼,您的問題聲明將受益於改寫爲小的,獨立的,非常明顯的序列圖。

據我所知,你拿一個數字列表xs並尋找值i,使得xs[i] + xs[i + 1] == target

因此,我們首先生成一個三元組列表(i, x[i], x[i + 1]),然後掃描它的解決方案。

一種明確的方法:

def pairs(xs): 
    for i in range(len(xs) - 1): 
    yield (i, xs[i], xs[i + 1]) 

一個單行道,罰款合理的短名單:

def pairs(xs): 
    return zip(range(len(xs)), xs, xs[1:]) 

現在找到匹配:

matches = [(i, x0, x1) for (i, x0, x1) if x0 + x1 == target] 

我們不標記錯配的各種條件,但。如果上述列表理解轉換爲顯式循環,則可以添加Tese。

希望這會有所幫助。