Identify groups of consecutive numbers in a list

grouping, list, python

Solution

`more_itertools.consecutive_groups` was added in version 4.0.

Demo

import more_itertools as mit


iterable = [2, 3, 4, 5, 12, 13, 14, 15, 16, 17, 20]
[list(group) for group in mit.consecutive_groups(iterable)]
# [[2, 3, 4, 5], [12, 13, 14, 15, 16, 17], [20]]

Code

Applying this tool, we make a generator function that finds ranges of consecutive numbers.

def find_ranges(iterable):
    """Yield range of consecutive numbers."""
    for group in mit.consecutive_groups(iterable):
        group = list(group)
        if len(group) == 1:
            yield group[0]
        else:
            yield group[0], group[-1]


iterable = [2, 3, 4, 5, 12, 13, 14, 15, 16, 17, 20]
list(find_ranges(iterable))
# [(2, 5), (12, 17), 20]

The source implementation emulates a classic recipe (as demonstrated by @Nadia Alramli).

Note: `more_itertools` is a third-party package installable via `pip install more_itertools`.

Problem

I'd like to identify groups of consecutive numbers in a list, so that: ``` myfunc([2, 3, 4, 5, 12, 13, 14, 15, 16, 17, 20]) ``` Returns: ``` [(2,5), (12,17), 20] ``` And was wondering what the best way to do this was (particularly if there's something inbuilt into Python). Edit: Note I originally forgot to mention that individual numbers should be returned as individual numbers, not ranges.

Original source

Related problems