user2390206
user2390206

Reputation: 113

Checking whether a list of numbers contains ANY five number sequence

I have a list that only includes positive integers:

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

The list is sorted.

What would be the most "pythonic" way to check whether the list contains any sequence of x consequtive number? It shouldn't matter whether the sequence starts at the beginning of the list, or ends at the end of the list - as long as it's in the list, it should return true. For instance, if I wanted to check if the following list contains a 4-number sequence:

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

It should return true due to [3, 4, 5, 6]

I have seen multiple StackOverflow questions about "finding number sequences in lists", however none of them dealt with looking for a sequence in only a portion of the list. (What I found was useful only if the goal was to check whether the entire list is sequential.)

Upvotes: 0

Views: 331

Answers (3)

BallpointBen
BallpointBen

Reputation: 13750

Here's a one liner:

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))

Upvotes: 3

Seek Addo
Seek Addo

Reputation: 1893

You can try this: after grouping them with the difference, you just check if any of the groups contains your preferred number of consecutive sequence(in this case 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)

True

I hope this is what you looking for.

Upvotes: 2

inspectorG4dget
inspectorG4dget

Reputation: 113905

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)

Output:

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

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

Upvotes: 2

Related Questions