在python列表中对连续数字进行运算

时间:2018-08-09 15:31:37

标签: python list

我正在尝试编写一个接受整数列表作为参数的函数。然后,它将找到所有3个连续数字的运行,这些运行数字增加或减少1。它将返回每个运行的第一个元素的索引列表。如果没有连续运行,则应返回None
示例:[1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7, 8, 7]返回[0, 4, 6, 7]。我将为您提供任何帮助,以帮助您解决该问题。

我的尝试给了我错误的输出:

lst = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7, 8, 7]


def cal_abs(a, b, c):

  return abs(a - b) == 1 and abs(b - c) == 1

def consecutive(lst):

   a = []

   for i in range(0,lst[-1]):

       if cal_abs(lst[i], lst[i+1], lst[i+2]):

           a.append(i)

          i += 1

   print(a)

现在我运行consecutive(lst)

它返回[0, 4, 5, 6]。错误。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

有两个问题。我会给您一些提示,这些提示应该足以弄清楚并修复它们。

此:

return abs(a - b) == 1 and abs(b - c) == 1

接受增加,然后减少,反之亦然。这与您的问题陈述不太吻合,问题陈述似乎需要两次增加或两次减少。

此外,主循环lst[-1]的上限采用最后一个元素的值-为什么?

答案 1 :(得分:1)

您将需要检查> b> c或a

lst = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7, 8, 7]

def cal_abs(a, b, c):
    if a < b and b < c and (a-b) == -1 and (b-c) == -1:
        return True
    elif a > b and b > c and (a-b) == 1 and (b-c) == 1:
        return True
    else:
        return False

def consecutive(lst):
    a = []
    for i in range(0,len(lst)-3):
        if cal_abs(lst[i], lst[i+1], lst[i+2]):
            a.append(i)
            i += 1
    print(a)

consecutive(lst)

答案 2 :(得分:0)

我建议创建一个名为isARun(f, m, l)的辅助函数

def isARun(f,m,l):
    return (f == m-1 and f == l-2) or (f == m + 1 and f == l+2)

然后,您要在主函数consecutive中进行如下所示的for循环。

for i in range(len(l) - 3):
    if (isARun(l[i], l[i+1], l[i+2])):
        a.append(i)
if len(a) == 0:
    return None
return a

答案 3 :(得分:0)

尝试这个简单的解决方案:

my_list = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7, 8, 7]

consective_indices = []
for index, num in enumerate(my_list[:-2]):
    immediate_next = abs(my_list[index + 1])
    next = abs(my_list[index + 2])
    if (num + 1 == immediate_next and num + 2 == next) or 
              (num - 1 == immediate_next and num - 2 == next):

        consective_indices.append(index)

print consective_indices

希望这会有所帮助。干杯!