将数字列表或范围表示的字符串展开为有序数字列表

138 阅读3分钟

我们需要解析一个描述一组数字的字符串。这些数字按顺序排列,但连续数字的范围可以用连字符/破折号缩写为一个"范围"。

例如,字符串 "001,008-011,020" 将被解释为有序列表: [1, 8, 9, 10, 11, 20]。

字符串中可以包含任意数量的范围和元素。

2、解决方案

方法一:

def expand_string(string):
    """
    将数字列表或范围表示的字符串展开为有序数字列表。
    """

    # 将字符串按逗号分隔。
    parts = string.split(',')

    # 创建一个空列表来存储展开后的数字。
    numbers = []

    # 遍历每个部分。
    for part in parts:
        # 如果字符串包含连字符/破折号,则它表示一个范围。
        if '-' in part:
            # 将范围分成两个数字。
            start, end = part.split('-')

            # 将两个数字转换为整数。
            start = int(start)
            end = int(end)

            # 将范围内的所有数字添加到列表中。
            for number in range(start, end + 1):
                numbers.append(number)
        # 否则,将字符串转换为整数并添加到列表中。
        else:
            number = int(part)
            numbers.append(number)

    # 返回展开后的数字列表。
    return numbers


# 测试代码。
string = "001,008-011,020"
print(expand_string(string))

方法二:

def expand_string(string):
    """
    将数字列表或范围表示的字符串展开为有序数字列表。
    """

    # 将字符串按逗号分隔。
    parts = string.split(',')

    # 创建一个空列表来存储展开后的数字。
    numbers = []

    # 遍历每个部分。
    for part in parts:
        # 如果字符串包含连字符/破折号,则它表示一个范围。
        if '-' in part:
            # 将范围分成两个数字。
            start, end = part.split('-')

            # 将两个数字转换为整数。
            start = int(start)
            end = int(end)

            # 将范围内的所有数字添加到列表中。
            numbers.extend(range(start, end + 1))
        # 否则,将字符串转换为整数并添加到列表中。
        else:
            number = int(part)
            numbers.append(number)

    # 返回展开后的数字列表。
    return numbers


# 测试代码。
string = "001,008-011,020"
print(expand_string(string))

方法三:

def expand_string(string):
    """
    将数字列表或范围表示的字符串展开为有序数字列表。
    """

    # 将字符串按逗号分隔。
    parts = string.split(',')

    # 创建一个空列表来存储展开后的数字。
    numbers = []

    # 遍历每个部分。
    for part in parts:
        # 如果字符串包含连字符/破折号,则它表示一个范围。
        if '-' in part:
            # 将范围分成两个数字。
            start, end = part.split('-')

            # 将两个数字转换为整数。
            start = int(start)
            end = int(end)

            # 将范围内的所有数字添加到列表中。
            for number in range(start, end + 1):
                numbers.append(number)
        # 否则,将字符串转换为整数并添加到列表中。
        else:
            number = int(part)
            numbers.append(number)

    # 返回展开后的数字列表。
    return numbers


# 测试代码。
string = "001,008-011,020"
print(expand_string(string))

三种解决方案本质上是相同的,都是将字符串中的数字或范围解析成整数,然后将这些整数添加到列表中。

最后,返回展开后的数字列表。