将整数列表转换为范围列表

时间:2014-03-18 02:30:25

标签: python-3.x

我的每个输入都是一组整数,可以分成几个连续范围,我想将每个组转换为一系列范围。 我在网上找到了一个代码如下:

from itertools import count, groupby
L=set(range(1,2000))
G=(list(x) for _,x in groupby(L, lambda x,c=count(): next(c)-x))
result= (",".join("-".join(map(str,(g[0],g[-1])[:len(g)])) for g in G))
print(result)

L=set(range(1539876,1540871))  #to be replaces by a set of integer numbers in real code
G=(list(x) for _,x in groupby(L, lambda x,c=count(): next(c)-x))
result= (",".join("-".join(map(str,(g[0],g[-1])[:len(g)])) for g in G))
print(result)

具有以下结果:

1-1999
1540096-1540870,1539876-1540095

正如你可以看到的第二组数字,它将一个连续的范围分成两个范围,在我的真实数据集中,它的作用更差。我不知道这个代码有什么问题,对于某些数字,它不能很好地运行。  我很感激,如果有人能给我一个解决方案

1 个答案:

答案 0 :(得分:1)

groupby用于收集序列中的连续组。由于您将set传递给了L = sorted(L),这是无序的,因为这些条款没有排序,您会遇到麻烦。如果我们添加>>> from itertools import count, groupby >>> L=set(range(1539876,1540871)) >>> L=sorted(L) >>> G=(list(x) for _,x in groupby(L, lambda x,c=count(): next(c)-x)) >>> result= (",".join("-".join(map(str,(g[0],g[-1])[:len(g)])) for g in G)) >>> print(result) 1539876-1540870 ,我们会得到:

{{1}}