检查数字列表是否包含任意五个数字序列

时间:2016-10-23 01:30:30

标签: python-3.x

我有一个只包含正整数的列表:

my_list = [1, 2, 4, 7, 9, 10, 15, 16]

列表已排序。

检查列表是否包含任何序列x序列号的最“pythonic”方法是什么?无论序列是从列表的开头开始,还是在列表的末尾结束都无关紧要 - 只要它在列表中,它就应该返回true。例如,如果我想检查以下列表是否包含4个数字序列:

my_list = [1, 3, 4, 5, 6, 8, 10]

由于[3, 4, 5, 6]

,它应该返回true

我已经看到多个关于“在列表中查找数字序列”的StackOverflow问题,但是它们都没有涉及仅在列表的部分中查找序列。 (我发现只有在目标是检查整个列表是否是连续的时才有用。)

3 个答案:

答案 0 :(得分:3)

这是一个班轮:

def has_sequence(L, seq_len):
    return any(list(L[i:i+seq_len]) == list(range(L[i],L[i]+seq_len))
               for i in range(len(L)-seq_len+1))

答案 1 :(得分:2)

def findRun(L, n):
    runlen = 0
    for i in range(1, len(L)):
        if L[i] == L[i-1]+1:
            runlen += 1
        else:
            runlen = 0
        if runlen == n-1:
            print("Found a run starting at", i-n+1)

输出:

In [451]: L = [1, 3, 4, 5, 6, 8, 10]

In [452]: findRun(L, 4)
Found a run starting at 1

答案 2 :(得分:2)

你可以试试这个: 在使用差异对它们进行分组后,您只需检查是否有任何组包含您的首选连续序列数(在本例中为4)。

from itertools import groupby
from operator import itemgetter
my_list = [1, 3, 4, 5, 6, 8, 10]
check = False
 for key, group in groupby(enumerate(my_list), lambda (i, val): i - val):
    g = map(itemgetter(1), group)
    if len(g) == 4:
        check = True
print(check)
  

我希望这就是你要找的。