How to see if the list contains consecutive numbers

后端 未结 12 1359
别跟我提以往
别跟我提以往 2021-02-07 12:50

I want to test if a list contains consecutive integers and no repetition of numbers. For example, if I have

l = [1, 3, 5, 2, 4, 6]

It should re

相关标签:
12条回答
  • 2021-02-07 13:09

    For the whole list, it should just be as simple as

    sorted(l) == list(range(min(l), max(l)+1))
    

    This preserves the original list, but making a copy (and then sorting) may be expensive if your list is particularly long.

    Note that in Python 2 you could simply use the below because range returned a list object. In 3.x and higher the function has been changed to return a range object, so an explicit conversion to list is needed before comparing to sorted(l)

    sorted(l) == range(min(l), max(l)+1))
    

    To check if n entries are consecutive and non-repeating, it gets a little more complicated:

    def check(n, l):
        subs = [l[i:i+n] for i in range(len(l)) if len(l[i:i+n]) == n]
        return any([(sorted(sub) in range(min(l), max(l)+1)) for sub in subs])
    
    0 讨论(0)
  • 2021-02-07 13:12

    list must be sorted!

    lst = [9,10,11,12,13,14,15,16]
    
    final = True if len( [ True for x in lst[:-1] for y in lst[1:] if x + 1 == y ] ) == len(lst[1:]) else False
    

    i don't know how efficient this is but it should do the trick.

    0 讨论(0)
  • 2021-02-07 13:14

    I split your query into two parts part A "list contains up to n consecutive numbers" this is the first line if len(l) != len(set(l)):

    And part b, splits the list into possible shorter lists and checks if they are consecutive.

    def example (l, n):
        if len(l) != len(set(l)):  # part a
            return False
        for i in range(0, len(l)-n+1):  # part b
            if l[i:i+3] == sorted(l[i:i+3]):
                return True
        return False
    
    l = [1, 3, 5, 2, 4, 6]
    print example(l, 3)
    
    0 讨论(0)
  • 2021-02-07 13:17

    We can use known mathematics formula for checking consecutiveness, Assuming min number always start from 1

    sum of consecutive n numbers 1...n = n * (n+1) /2 
    
    
      def check_is_consecutive(l):
            maximum = max(l)
            if sum(l) == maximum * (maximum+1) /2 : 
                 return True
            return False
    
    0 讨论(0)
  • 2021-02-07 13:20

    The input to this function is your list.This function returns False if the numbers are repeated. The below code works even if the list does not start with 1.

    def check_is_consecutive(l):
        """
        sorts the list and 
        checks if the elements in the list are consecutive
        This function does not handle any exceptions.
        returns true if the list contains consecutive numbers, else False
        """
        l = list(filter(None,l))
        l = sorted(l)
        if len(l) > 1:
            maximum = l[-1]
            minimum = l[0] - 1
            if minimum == 0:
                if sum(l) == (maximum * (maximum+1) /2): 
                    return True
                else:
                    return False
            else:
                if sum(l) == (maximum * (maximum+1) /2) - (minimum * (minimum+1) /2) : 
                    return True
                else:
                    return False
        else:
            return True
    
    0 讨论(0)
  • 2021-02-07 13:22

    The first code removes duplicates but keeps order:

    from itertools import groupby, count
    
    l = [1,2,4,5,2,1,5,6,5,3,5,5]
    
    def remove_duplicates(values):
        output = []
        seen = set()
        for value in values:
            if value not in seen:
                output.append(value)
                seen.add(value)
        return output
    
    l = remove_duplicates(l) # output = [1, 2, 4, 5, 6, 3]
    

    The next set is to identify which ones are in order, taken from here:

    def as_range(iterable):
        l = list(iterable)
        if len(l) > 1:
            return '{0}-{1}'.format(l[0], l[-1])
        else:
            return '{0}'.format(l[0])
    
    l = ','.join(as_range(g) for _, g in groupby(l, key=lambda n, c=count(): n-next(c)))
    

    l outputs as: 1-2,4-6,3

    You can customize the functions depending on your output.

    0 讨论(0)
提交回复
热议问题