代码之家  ›  专栏  ›  技术社区  ›  BoarGules

带有空白的列表的文本表示

  •  0
  • BoarGules  · 技术社区  · 1 月前

    我有一个整数列表,它是排序的,不包含重复项:

    mylist =  [2, 5,6,7, 11,12, 19,20,21,22, 37,38, 40]
    

    我想要一个摘要文本表示,以连字符对的压缩形式显示相邻整数组。具体来说: 相邻 意味着幅度相差1。所以一个整数 被认为与 j 如果 j = ± 1. 回想一下,列表是排序的。这意味着相邻的整数将以单调递增的序列出现在列表中。

    所以我想要一些优雅的Python来代表 mylist 作为字符串

    "2, 5-7, 11-12, 19-22, 37-38, 40,"
    

    也就是说,

    • 一个孤立的整数(例如: 2 ,因为列表中既不包含 1 也没有 3 )表示为 2,
    • 一组相邻的整数(例如: 19,20,21,22 因为该组的每个成员与另一个成员相差1)表示为 ‹lowest›-‹highest›, 那就是 19-22, .

    我不敢相信这是一个没有人认为足够重要的问题来解决。请随时向我指出我错过的解决方案。

    2 回复  |  直到 1 月前
        1
  •  1
  •   Chris Charley    1 月前

    这个 intspan 图书馆这样做

    >>> mylist =  [2, 5,6,7, 11,12, 19,20,21,22, 37,38, 40]
    >>> from intspan import intspan
    >>> str(intspan(mylist))
    '2,5-7,11-12,19-22,37-38,40'
    
        2
  •  0
  •   Tinyfold    1 月前

    你可以试试这个:

    mylist = [2, 5, 6, 7, 11, 12, 19, 20, 21, 22, 37, 38, 40]
    ans = []
    ret = ''
    
    # assuming mylist is sorted
    for i in mylist:
        if len(ans) == 0 or ans[-1][1] < i - 1: #if the array is empty or we can't add current value to the last range
            ans.append([i, i]) # make a new range
        else:
            ans[-1][1] = i # add to last range
    
    for i in ans:
        # formating
        if i != ans[0]: 
            ret = ret + ' '
        if i[0] == i[1]: 
            ret = f'{ret}{i[0]},'
        else:
            ret = f'{ret}{i[0]}-{i[1]},'
    print(ret)
    

    希望这能有所帮助!

        3
  •  0
  •   inspectorG4dget Dillon Benson    1 月前
    def collapseRuns(L):
        if not L: return ''
    
        answer = [[L[0]]]
        for num in L[1:]:
            if num == answer[-1][-1]+1:
                answer[-1].append(num)
            else:
                answer.append([num])
    
        for i,L in enumerate(answer):
            if len(L) > 1:
                answer[i] = f"{L[0]}-{L[-1]}"
            else:
                answer[i] = f"{L[0]}"
    
        return ', '.join(answer)
    

    测试:

    In [158]: collapseRuns(L)
    Out[158]: '2, 5-7, 11-12, 19-22, 37-38, 40'
    
        4
  •  -1
  •   Godson Tudeme    1 月前

    使用下面的代码片段:

    mylist =  [2, 5,6,7, 11,12, 19,20,21,22, 37,38, 40]
    newlist = []
    i = 0
    while(i < len(mylist)):
        j = i
        if(i+1 < len(mylist)-1):
            while(mylist[i]+1 == mylist[i+1]):
                i = i+1
        newlist.append(mylist[j]) if j == i else newlist.append(str(mylist[j]) + " - " + str(mylist[i]))
        i = i+1
    

    :)