2017-06-29 58 views
0

基本上我試圖在列表中找到2個元素,並將它們加在一起給出正確的總和。如何遍歷列表並比較兩個數字之間的總和,最後用最接近的索引分組返回答案?

實施例:

aList = [1,5,6,3,8,9,4] sum = 10 

現在上述條件我會想到2個結果:

[1, 9] and [6, 4] 

答案應該是[6,4],因爲它們是彼此最接近。 1到9需要採取4個步驟,而[6,4]只需要採取3.最短的索引差異。

我的代碼如下,它不會對上面的例子中工作:

def sum_pairs(ints, s): 
for i in ints: 
    for b in ints[i:]: 
     if i + b == s: 
      return [i,b] 
else: 
    return None 

那麼你會怎麼最接近指數之間具有了寫另一回路檢查?

+0

您是否收到任何錯誤消息? – lkdhruw

+0

如果我沒有弄錯,問題不在於代碼在執行失敗的意義上「不起作用」;問題是它返回第一個「工作」對,而不是最接近的... – Archeo

+0

@Archeo是的,你是正確的,它的工作原理,但不返回最接近的索引對。謝謝你澄清。 –

回答

1

如果您想查找步數最少的數字,循環遍歷並嘗試所有具有給定距離的元組 - 您不應該嘗試使用中間有4個空格的對,而不要用所有元組耗盡距離3 ...

def sum_pairs(ints, s): 
    for distance in range(1, len(ints)): 
     for idx in range(len(ints) - distance): 
      if ints[idx] + ints[idx + distance] == s: 
       return [ints[idx], ints[idx + distance]] 
    return None 
0

「簡單」(不是最有效 - 看到另一個答案公佈:將一個循環通過觀察字符之間的空格PROCEDE更好)的解決方案:

def sum_pairs(ints, s): 
    answer = None 
    distance = 10 
    for i in ints: 
     for b in ints[i:]: 
      if i + b == s and abs(i - b) < distance: 
       answer = (i, b) 
       distance = abs(i - b) 
return answer 
0

你需要在retu之前將所有可能的解決方案存儲到列表中任何事情。

a = [] 
def sum_pairs(ints, s): 
    for i in ints: 
     for b in ints[i:]: 
      if i + b == s: 
       a.append([i,b]) 
    return a 

aList = [1,5,6,3,8,9,4] 

print sum_pairs(aList,10) 

輸出:[[1, 9], [6, 4]]

0

你不是真正的測試在所有的,你有,簡單地返回找到您想要輸入的總和所有匹配的列表中對之間的差異。

nums = [1,5,6,3,8,9,4] 

def sum_pairs(ints, s): 
    matches = [] 
    for i in range(len(ints)): 
    x = ints[i] 
    for y in ints[i + 1:]: 
     if x + y == s: matches.append([x, y]) 
    differences = {} 
    for x, y in matches: 
    differences[abs(x - y)] = [x, y] 
    return differences[min(differences.keys())] 

>>> sum_pairs(nums, 10) 
# [6, 4] 
相關問題