我正在尝试编写一个接受整数列表作为参数的函数。然后,它将找到所有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]
。错误。有什么想法吗?
答案 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
希望这会有所帮助。干杯!