Python 将整数转换为范围,但带有允许的孔
什么是将一组整数转换为范围(这已经有问题)但有某种可接受的裕度的最符合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的保证金,所以只有当上一个项目和下一个项目之间的差额大于20时,才会创建下一个范围 因此,我们应该得到:Python 将整数转换为范围,但带有允许的孔,python,range,Python,Range,什么是将一组整数转换为范围(这已经有问题)但有某种可接受的裕度的最符合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的保证金,所以只有当上一个项目和下一个项目之间的差额大于20时,才会创建下一个范围 因此,我们应该得到: {1,15},{45,47},{75,85}如果您可以从提供
{1,15},{45,47},{75,85}如果您可以从提供当前解决方案开始,我们可以确定是否有更具python风格的替代方案可用。如果您正在寻找对工作代码的注释/改进,也就是在主题上,我怀疑您从“填充序列中小于N的任何漏洞”开始,然后创建列表。这意味着-找到“相反”的集合-不包含的数字;使用链接中的方法查找运行长度;删除行程长度大于N的行程;然后合并两个集合。
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)]