2017-06-29 59 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] 
相关问题