2014-05-08 56 views
1

什么是将一组整数转换为范围的最常用pythonic方式(对此问题已存在converting a list of integers into range in python)但有某种可接受的边距?将整数转换为范围但带有允许的孔

实施例,我们有: 1,2,3,4,5,10,11,15,45,46,47,75,76,80,85

因此通常我们将得到: {1,5},{10,11},{15,15},{45,47},{75,76},{80,80},{85,85}

但我们想允许如果上一个项目与下一个项目之间的差异大于20,则将创建下一个范围

因此,我们应该得到: {1,15},{45,47},{75, 85}

+7

如果您可以从提供您当前的解决方案开始,我们可以确定是否有更多可用的Pythonic替代方案。 – chepner

+1

如果您正在寻找对工作代码的评论/改进,那就是http://codereview.stackexchange.com上的主题 – jonrsharpe

+0

我怀疑你是从“填充小于N的序列中的任何孔开始”,然后创建名单。这意味着 - 找到“相反”集 - 数字不包含;使用链接中的方法查找运行长度;删除运行长度大于N的那些;然后合并这两组。 – Floris

回答

1
def to_ranges(nums): 
    rngs = [] 
    start = nums[0] 
    curr = start 
    for n in nums[1:]: 
    if n > curr + 20: 
     rngs.append(range(start, curr + 1)) 
     start = n 
    curr = n 
    rngs.append(range(start, curr + 1)) 
    return rngs 

>>> to_ranges([1, 2, 3, 4, 5, 10, 11, 15, 45, 46, 47, 75, 76, 80, 85]) 
[range(1, 16), range(45, 48), range(75, 86)]