我的每个输入都是一组整数,可以分成几个连续范围,我想将每个组转换为一系列范围。 我在网上找到了一个代码如下:
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
正如你可以看到的第二组数字,它将一个连续的范围分成两个范围,在我的真实数据集中,它的作用更差。我不知道这个代码有什么问题,对于某些数字,它不能很好地运行。 我很感激,如果有人能给我一个解决方案
答案 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}}