问题描述1
存在多个不连续的数值区间,如 [1,10] 、[20,50] 、[100,200] … ,此时该如何高效判断一个数值在这些区间内?
问题描述2
生物学数据分析中,有时需要判断 SNPs 是否在 ChIPseq 或 ATACseq 的 peak 区域内,并删除掉不在这些区域内的 SNPs。在这些需求中, peak 区间的数量可能达到数万之多,如何仅用一次循环就能达到目的?
安装 py-part 包
pip install py-part
py-part 使用方法
from part import Interval
(1) 生成左闭右开的单个整数区间
interval = Interval[int](lower_value=10, upper_value=20)
print(interval)
# [10;20)
bool_ = 12 in interval
print(bool_)
# True
(2) 默认情况下,生成的区间为左闭右开
,可以通过 upper_closed
和 lower_closed
进行设置。如下,生成左开右闭的区间。
interval = Interval[int](lower_value=10, upper_value=20, upper_closed=True, lower_closed=False)
print(interval)
# (10;20]
(3) 生成字符区间
interval = Interval[str](lower_value="abc", upper_value="def", upper_closed=True)
# ['abc';'def']
(4) 两个区间是否存在交集判断
a = Interval[int](lower_value=10, upper_value=20)
b = Interval[int](lower_value=15, upper_value=30)
# 判断a与b区间是否存在交集
a.overlaps(b)
# True
(5) 判断两个区间是否具有相同的起点或终点
a = Interval[int](lower_value=10, upper_value=20)
b = Interval[int](lower_value=15, upper_value=30)
# 判断a与b区间的起点是否相同
a.starts(b)
# False
# 判断a与b区间的终点是否相同
a.finishes(b)
# False
(6) 利用 FrozenIntervalSet
构造多个区间
from part import FrozenIntervalSet
每个区间用一个元组表示,所有区间通过列表传递给 FrozenIntervalSet 函数。例如:
a = FrozenIntervalSet[int]([2, (6, 7), (8, 9, None), (10, 11, True, True)])
print(a)
# [2;2] | [6;7) | (8;9) | [10;11]
其它方法参照官方文档