使用二分查找进行bed区域过滤

一、背景

  • 有的时候,我们需要手动对结果文件(可能是vcf,xls,或者其他形式)进行bed文件的过滤,这时候如何高效准确的对posi是否在目标区域内,成为关键。

二、关键点

① bed是0-based,vcf等格式是1-based,注意转换时,start+1,end不变

def get_bed_dic(input_bed):
'''将不同染色体的region信息存为列表,整体存为字典'''
    with open(input_bed) as ff:
        dic={}
        for line in ff:
            tmps=line.strip().split("\t")
            if tmps[0] not in dic:
                dic[tmps[0]]=[]
            dic[tmps[0]].append([int(tmps[1])+1,int(tmps[2])])
    return dic

② 大家一定不要想着用循环遍历,太慢了。建议用二分查找判断目标位置是否在target region里,速度奥奥快,嗖嗖的。

def binary_search(target,bed_list):
    '''用二分查找的方法,看看目标位置是不是落于bed区域里'''
    target=int(target)
    first=0
    last=len(bed_list)-1
    while first<=last:
        mid = (first + last)//2
        if target>=int(bed_list[mid][0]) and target<=int(bed_list[mid][1]):
            return True
        elif target < int(bed_list[mid][0]):
            last = mid-1
        else:
            first= mid+1
    return False

如果大家对原理感兴趣,给我留言吧,博主太懒了,就先不写原理了,代码见上啊。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容