在看到您的间隔不能重叠之前,我开始写这篇文章。这种方法有点矫枉过正,但我会放弃它,因为扔掉它似乎很浪费。
见底部的简短解决方案。
OOP 式的做事方式:
class Interval:
def __init__(self,left,right):
self.left = int(left)
self.right = int(right)
def __contains__(self,x):
return self.left <= int(x) <= self.right
intervals = [['HE670029', '4095', '4096'],
['HE670029', '4098', '4099'],
['HE670029', '4102', '4102']]
#if intervals aren't sorted, then do:
#cuts = [Interval(*x[1:]) for x in sorted(intervals,key=lambda i: i[1])]
cuts = [Interval(*x[1:]) for x in intervals]
#this step is overkill, since we know our intervals can't overlap
breakpoints = [x for x in range(1,5000) if any(x in cut for cut in cuts)]
def gen_segments(breakpoints, id_='HE670029', start=0, end=5000 ):
for pair in chunks(breakpoints,2):
if len(pair) < 2: #last breakpoint may be singleton
pair += pair
left,right = pair
yield id_, start, left-1
start = right+1
yield id_, start, end
chunks 是this 页面上的几个块配方之一。演示:
list(gen_segments(breakpoints))
Out[258]:
[('HE670029', 0, 4094),
('HE670029', 4097, 4097),
('HE670029', 4100, 4101),
('HE670029', 4103, 5000)]
就像我说的那样,上面的内容太过分了。如果您知道间隔不重叠,则不需要花哨的Interval 类或任何东西。只需这样做:
breakpoints = [int(x) for interval in intervals for x in interval[1:]]
然后直接使用上面的gen_segments。