用破折号写出数字范围

rgu*_*014 5 python

我不太清楚如何提出这个问题,甚至在Google上搜索答案,但我会在这里写出来.我有一个整数的排序列表,对应于文件中的行号.我想将它们转换为字符串,但对于顺序的数字,我希望字符串具有序列的第一个数字,短划线,然后是最后一个数字.这是一个例子:

line_nums = [ 1, 2, 3, 5, 7, 8, 9, 10 ]
Run Code Online (Sandbox Code Playgroud)

我想将该列表转换为:

[ '1-3', '5', '7', '8-10' ]
Run Code Online (Sandbox Code Playgroud)

我写了一些大部分都有效的代码.在某些序列中,它会将相同的数字放在字符串中两次.在最近执行此代码时,输​​入是:

[ 10007, 10008, 10009, 10010, 10011, 10013, 10015, 10016, 10017, 10018, 10019 ]
Run Code Online (Sandbox Code Playgroud)

但我得到的是:

[ '10007-10011', '10013-10013', '10015-10019' ]
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

def get_line_numbers_concat(line_nums):
    seq = []
    final = []
    last = 0

    for index, val in enumerate(line_nums):

        if last + 1 == val or index == 0:
            seq.append(val)
            last = val
        else:
            final.append(str(seq[0]) + '-' + str(seq[len(seq)-1]))
            seq = []
            seq.append(val)
            last = val

        if index == len(line_nums) - 1:
            if len(seq) > 1:
                final.append(str(seq[0]) + '-' + str(seq[len(seq)-1]))
            else:
                final.append(str(seq[0]))

    final_str = ', '.join(map(str, final))
    return final_str
Run Code Online (Sandbox Code Playgroud)

nvu*_*ono 5

你几乎就在那里,除非在这种情况下,你seq[0]实际上是相同的元素,seq[len(seq)-1]然后你简化到下面的情况len(seq)==1或如下所示,if len(seq) > 1然后你执行你的正常处理,否则只需添加第一个元素.

def get_line_numbers_concat(line_nums):
    seq = []
    final = []
    last = 0

    for index, val in enumerate(line_nums):

        if last + 1 == val or index == 0:
            seq.append(val)
            last = val
        else:
            if len(seq) > 1:
               final.append(str(seq[0]) + '-' + str(seq[len(seq)-1]))
            else:
               final.append(str(seq[0]))
            seq = []
            seq.append(val)
            last = val

        if index == len(line_nums) - 1:
            if len(seq) > 1:
                final.append(str(seq[0]) + '-' + str(seq[len(seq)-1]))
            else:
                final.append(str(seq[0]))

    final_str = ', '.join(map(str, final))
    return final_str
Run Code Online (Sandbox Code Playgroud)