问题描述
假设我们有一个整数列表,如下所示:
ls = [1,5,10,11,12,20,26,31,32,33,34]
也就是说,在上面的示例中,我们有3个此类事件,其索引为:
-
[2,3,4]
,[7,8,9]
和[8,9,10]
对应于元素[10,12]
,[31,33]
和[32,34].
解决方法
这应该有效:
matching = []
for i in range(len(ls)):
sub_ls = ls[i:i+3]
deltas = [nb-sub_ls[_index] for _index,nb in enumerate(sub_ls[1:])]
if deltas == [1,1]:
matching.append((i,i+1,i+2))
输出:
[(2,3,4),(7,8,9),(8,9,10)]
,
def check(ls):
for i in range(len(ls)-1):
if ls[i+1] != ls[i] + 1:
return False
return True
result = [[i+j for j in range(3)] for i in range(len(ls)-2) if check(ls[i:i+3])]
列表理解的替代答案!
,我想到的最简单的解决方案是遍历3个元素的子集中的列表并检查条件。
n = 3 #Number of elements in subset of list,in your question it's 3
x = [1,5,10,11,12,20,26,31,32,33,34]
for i in range(len(x)-n+1):
a,b,c = x[i:i+n]
if b-a == c-b == 1:
print('indices->',list(range(i,i+n)),'values->',x[i: i+n])
输出:
indices-> [2,4] values-> [10,12]
indices-> [7,9] values-> [31,33]
indices-> [8,10] values-> [32,34]