在列表中查找特定顺序的实例

问题描述

假设我们有一个整数列表,如下所示:

ls = [1,5,10,11,12,20,26,31,32,33,34]
  • 有没有一种方法可以快速找到列表中3个连续整数(以它们的索引为单位)的所有出现(它们的索引加1)?输入列表已经排序。

也就是说,在上面的示例中,我们有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]