Извлечение диапазона стало проще: преобразование списка целых чисел в формат диапазона

Вы когда-нибудь сталкивались с ситуацией, когда вам нужно было преобразовать список целых чисел, разделенных запятыми, в более краткий формат диапазона? Ну, не волнуйтесь больше! В этой статье мы рассмотрим различные методы решения этой задачи, используя разговорный язык, и попутно предоставим примеры кода. Итак, давайте углубимся и упростим ваши потребности в манипуляциях с данными!

Метод 1: наивный подход
Самый простой способ преобразовать список целых чисел в формат диапазона — использовать простой алгоритм. Вот как это работает:

def naive_range_extraction(lst):
    ranges = []
    start = lst[0]
    end = lst[0]
    for i in range(1, len(lst)):
        if lst[i] == end + 1:
            end = lst[i]
        else:
            if start == end:
                ranges.append(str(start))
            else:
                ranges.append(str(start) + "-" + str(end))
            start = lst[i]
            end = lst[i]
    if start == end:
        ranges.append(str(start))
    else:
        ranges.append(str(start) + "-" + str(end))
    return ",".join(ranges)

Метод 2: использование itertools.groupby
Модуль itertools Python предоставляет мощную функцию groupby, которую можно использовать для эффективного извлечения диапазона. Вот пример реализации:

from itertools import groupby
def groupby_range_extraction(lst):
    ranges = []
    for k, g in groupby(enumerate(lst), lambda i_x: i_x[0] - i_x[1]):
        group = list(map(lambda x: str(x[1]), g))
        if len(group) > 1:
            ranges.append(str(group[0]) + "-" + str(group[-1]))
        else:
            ranges.append(group[0])
    return ",".join(ranges)

Метод 3: использование рекурсивного подхода
Еще один интересный способ решения этой проблемы — использование рекурсивной функции. Вот пример реализации на Python:

def recursive_range_extraction(lst):
    if not lst:
        return ""
    if len(lst) == 1:
        return str(lst[0])
    if lst[0] == lst[1] - 1:
        return str(lst[0]) + "-" + recursive_range_extraction(lst[1:])
    return str(lst[0]) + "," + recursive_range_extraction(lst[1:])

В этой статье мы рассмотрели три различных метода преобразования списка целых чисел, разделенных запятыми, в формат диапазона. Наивный подход предоставляет простой алгоритм для выполнения задачи, а использование Python itertools.groupby предлагает более краткое решение. Наконец, рекурсивный подход демонстрирует другой взгляд на решение проблемы.

Вы можете выбрать тот метод, который лучше всего соответствует вашим потребностям. Удачного извлечения диапазона!