格式化连续数字

Yos*_*iki 5 python format int

我正在尝试使用Python格式化整数列表,但是我在实现我想要的方面遇到了一些困难.

输入是整数的排序列表:

list = [1, 2, 3, 6, 8, 9]
Run Code Online (Sandbox Code Playgroud)

我希望它的输出是一个像这样的字符串:

outputString = "1-3, 6, 8-9"
Run Code Online (Sandbox Code Playgroud)

到目前为止,我设法实现的目标是:

outputString = "1-2-3, 6, 8-9"
Run Code Online (Sandbox Code Playgroud)

如果它已经连续,我很难告诉我的代码忽略一个Int.

到目前为止,这是我的代码:

def format(l):
    i = 0
    outputString = str(l[i])
    for x in range(len(l)-1):
        if l[i + 1] == l[i]+1 :
            outputString += '-' + str(l[i+1])
        else :
            outputString += ', ' + str(l[i+1])
        i = i + 1
    return outputString
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助和见解:)

Chi*_*xus 6

您可以像这样使用groupbycount来自itertools模块:

编辑:

感谢@asongtoruin评论.要从输入中删除重复项,您可以使用:sorted(set(a)).

from itertools import groupby, count

a = [1, 2, 3, 6, 8, 9]
clustered = [list(v) for _,v in groupby(sorted(a), lambda n, c = count(): n-next(c))]

for k in clustered:
    if len(k) > 1:
        print("{0}-{1}".format(k[0], k[-1]))
    else:
        print("{0}".format(k[0]))
Run Code Online (Sandbox Code Playgroud)

输出:

1-3
6
8-9
Run Code Online (Sandbox Code Playgroud)

或者也许你可以做这样的事情,以获得一个漂亮的输出:

from itertools import groupby, count

a = [1, 2, 3, 6, 8, 9]
clustered = [list(v) for _,v in groupby(sorted(a), lambda n, c = count(): n-next(c))]
out = ", ".join(["{0}-{1}".format(k[0], k[-1]) if len(k) > 1 else "{0}".format(k[0]) for k in clustered ])

print(out)
Run Code Online (Sandbox Code Playgroud)

输出:

1-3, 6, 8-9
Run Code Online (Sandbox Code Playgroud)