菜鸟也来学生信

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

2022-08-02  本文已影响0人  real3721

一、背景

二、关键点

① 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

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

上一篇 下一篇

猜你喜欢

热点阅读