我正在尝试使用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)
感谢您的帮助和见解:)
您可以像这样使用groupby和count来自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)