编写程序以确定给定列表是否具有加法序列

时间:2019-03-19 04:05:13

标签: python python-3.x

我是一名热衷编程的本科生。今天我遇到了一个使我非常困惑的问题。

  

编写程序以确定给定列表是否具有加法器   顺序。也就是说,由3个连续元素组成的序列   前两个元素加起来是第三个元素。返回总和值。或返回   如果没有这样的金额,则没有。

     

示例1:

     
      
  • 输入:[0,1,2,3,5,8,13]

  •   
  • 输出:3,因为1 + 2 =3。请注意,8也是前两个值的总和,但是它在3之后

  •   
     

示例2:

     
      
  • 输入:[1,2,4,5,6]

  •   
  • 输出:无。由于没有连续的值求和为第三个连续的值。

  •   

我的答案是:

def sequence_sum(my_list):
    for x in range(0, len(my_list)):
        if (my_list[x] + my_list[x+1]) != my_list[x+2]:
            return None
        else:
            return my_list[x+2]

测试结果为:

Traceback (most recent call last):
  File "/grade/run/test.py", line 30, in test_larger
    self.assertEqual(sequence_sum(my_arr), 1)
AssertionError: None != 1

以及:

Traceback (most recent call last):
  File "/grade/run/test.py", line 35, in test_another
    self.assertEqual(sequence_sum([0,3,4,5,9]), 9)
AssertionError: None != 9

5 个答案:

答案 0 :(得分:0)

for x in range(0, len(my_list)):
    if (my_list[x] + my_list[x+1]) != my_list[x+2]:
        return None
    else:
        return my_list[x+2]

同时拥有两个分支return是一个错误,因为这意味着函数将在循环的第一次迭代中返回。如果找到比赛,直接返回是正确的。但是,如果找不到匹配项,就无法声明失败。稍后可能有一场比赛。 return None需要延迟,直到搜索了整个列表。

for x in range(0, len(my_list)):
    if my_list[x] + my_list[x+1] == my_list[x+2]:
        return my_list[x+2]
return None

这将解决当前的问题,但是运行它,您现在将遇到索引超出范围的异常。我将它留给您来调试该问题。

答案 1 :(得分:0)

在我看来,您只检查列表的第一部分。 return不管在哪里都将退出该函数,因此在检查0 + 3是否等于4后,它将返回None。因此,请永远不要检查9

要解决此问题,请将return移至函数末尾,并使比较器进入==

for loop:
  if ([list[x]+list[x+1]) == list[x+2]:
    return list[x+2]
return None

答案 2 :(得分:0)

for x in range(0, len(my_list) - 2):
    if my_list[x] + my_list[x + 1] == my_list[x + 2]:
        return my_list[x + 2]
return None

您正在检查所有索引(0、1、2、3 ...),直到第二个索引才在最后一个索引之前,以免触发索引越界异常。 在那里,您检查两个连续的元素是否是列表中下一个元素的总和。 如果有这样的一对,则将其退回。如果没有(遍历整个列表),则返回None。

答案 3 :(得分:0)

您可以使用deque保存最后两个元素:

from collections import deque

def func(l: list):
    seq = deque(maxlen=2)
    for num, i in enumerate(l):
        if num > 1 and sum(seq) == i:
            return i
        else:
            seq.append(i)

print(func([0, 1, 2, 3, 5, 8, 13]))
# 3

print(func([1,2,4,5,6]))
# None        

答案 4 :(得分:0)

另一种方式:

found_sums = [x for i, x in enumerate(data[2:])
             if data[i] + data[i+1] == x]
first_value = next(iter(found_sums), None)

found_sums 是一个列表推导,返回的值等于前两个值之和。 first_value 返回这些值中的第一个;如果列表为空,则返回None。

测试:

for data in ([0,1,2,3,5,8,13], [1,2,4,5,6]):
    found_sums = [x for i, x in enumerate(data[2:]) if data[i] + data[i + 1] == x]
    first_value = next(iter(found_sums), None)
    print('Result for {}:\t{}'.format(data, first_value))

这将返回:

  

[0,1,2,3,5,8,13]的结果:3

     

[1、2、4、5、6]的结果:无