Как сделать обратный `range`, то есть создать компактный диапазон на основе набора чисел?

Python имеетrange метод, который позволяет такие вещи, как:

>>> range(1, 6)
[1, 2, 3, 4, 5]

То, что я ищу, это как бы наоборот: возьмите список чисел и верните начало и конец.

>>> magic([1, 2, 3, 4, 5])
[1, 5] # note: 5, not 6; this differs from `range()`

Это достаточно легко сделать для приведенного выше примера, ноМожно ли учесть пропуски или множественные диапазоны, возвращая диапазон в формате строки, подобном PCRE? Что-то вроде этого:

>>> magic([1, 2, 4, 5])
['1-2', '4-5']
>>> magic([1, 2, 3, 4, 5])
['1-5']

Редактировать: Я ищу решение на Python, но приветствую рабочие примеры и на других языках. Это больше о создании элегантного, эффективного алгоритма. Бонусный вопрос: есть ли язык программирования, который имеет встроенный метод для этого?

Ответы на вопрос(6)

Ваш ответ на вопрос