Python 超过阈值的分割间隔

Python 超过阈值的分割间隔,python,split,intervals,Python,Split,Intervals,我有一个元组列表,每个元组定义一个间隔(开始、结束)。 我想分割超过某个阈值的间隔 例如: Initial list: segs = [(0,100),(120,140),(160,200)] Threshold: 30 期望输出: split_segs = [(0,30),(30,60),(60,90),(90,100),(120,140),(160,190),(190,200)] 我想出了这个密码 thr = 30. split_segs = [] for a,b in segs:

我有一个元组列表,每个元组定义一个间隔(开始、结束)。 我想分割超过某个阈值的间隔

例如:

Initial list: segs = [(0,100),(120,140),(160,200)] 
Threshold: 30
期望输出:

split_segs = [(0,30),(30,60),(60,90),(90,100),(120,140),(160,190),(190,200)]
我想出了这个密码

thr = 30.
split_segs = []
for a,b in segs:
    if b-a < thr:
        split_segs.extend([(a,b)])
    else:
        n = int((b-a)/thr)
        for i in range(n):
            if b-(a + (i+1)*thr) < thr:
                split_segs.extend([(a+(i+1)*thr, b)])
            else:
                split_segs.extend([(a+i*thr, a+(i+1)*thr)])
thr=30。
分割分割=[]
对于分段中的a、b:
如果b-a

它很管用,但在我看来很笨拙。有更好或更好的pythonic解决方案吗?

您可以通过扩展一个
范围
,该范围有一个
阈值

segs=[(0100)、(120140)、(160200)]
阈值=30
分割分割=[]
对于分段中的分段:
(a,b)=seg
差异=b-a

如果diff这是针对您的问题的递归解决方案:

segs = [(0,100),(120,140),(160,200)] 
threshold = 30

def divide(to_divide):
    divided = []
    if to_divide[1] - to_divide[0] > threshold:
        divided.append((to_divide[0], to_divide[0] + threshold))
        divided.extend(divide((to_divide[0] + threshold, to_divide[1])))
        return divided
    else:
        return [to_divide]

divided = [el for x in segs for el in divide(x)]
print(divided)
输出将是:

[(0, 30), (30, 60), (60, 90), (90, 100), (120, 140), (160, 190), (190, 200)]

更新:如果您喜欢非递归解决方案,这是一种可能的解决方案:

segs = [(0,100),(120,140),(160,200)] 
threshold = 30

def divide(to_divide):
    divided = []
    divided.extend((to_divide[0] + i * threshold, to_divide[0] + (i+1) * threshold) for i in range((to_divide[1] - to_divide[0]) // threshold))
    if divided:
        if divided[-1][1] != to_divide[1]:
            divided.append((divided[-1][1], to_divide[1]))
    else:
        divided.append((to_divide[0], to_divide[1]))
    
    return divided

divided = [el for x in segs for el in divide(x)]
print(divided)

谢谢,我同意这更优雅一点。谢谢,这是一个不错的选择。一般来说,我倾向于避免递归代码,但在这种情况下,这是一个不错的选择。@Moz stack我能问一下为什么要避免递归代码吗?在某些情况下(当然不是这样),它是基本的,并且可以非常强大。它可能很复杂,但在Python中无法避免,递归比迭代代码慢,并且当输入足够大时,可能会导致堆栈内存不足。我不是说一般避免递归编码,而是说它没有提供明显的优势。我认为迭代循环更清晰,更容易阅读。但这只是我个人的观点:)谢谢@Aplet123,这是我没有考虑过的事情(无论如何我不会妖魔化递归)