Python:测试int列表中的int是否适合2-int元组列表中的两个int

时间:2014-10-19 01:17:31

标签: python python-2.7

背景:小鼠遗传学,我想计算两个实验室菌株之间的突变数量,这取决于它们是否落在外显子边界内。

到目前为止,我生成了2个列表:

SNPs = [432, 534, 677, 788, 999]等~2e7值总计

exon_limits = [(3, 6), (42, 444), (679, 999)]等~5e5值总计

我只想计算属于外显子限制(list2)的SNP(list1)的数量。这是我的代码:

exonic = 0
non_exonic = 0
for k, l in exon_limits:
    for j in SNPs:
        if j <= k or j >= l:
            exonic += 1
        else:
            non_exonic += 1

我对计算机科学的局限性了解不多,但是2e7 * 5e5可能可能无法处理,对吧?另外,我试图:

exonic = 0
non_exonic = 0
for k, l in exon_limits:
    for j in SNPs:
        if j <= k or j >= l:
            exonic += 1
            print exonic
        else:
            non_exonic += 1

要查看算法python的位置,但它似乎只是从0开始计算 - &gt;在我打断程序之前超过7e6。

每个SNP只适合一个元组,所以如果有一种方法可以让迭代停止一旦它找到一个可以加快速度的命中。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

假设外显子限制具有包容性并且不能重叠,并且两个列表都按升序排列:

exonic = 0
snp_l = len(SNPs)
exon_l = len(exon_limits)
snp_idx = 0
exon_idx = 0

while snp_idx < snp_l and exon_idx < exon_l:
    if SNPs[snp_idx] < exon_limits[exon_idx][0]:
        snp_idx += 1
    elif SNPs[snp_idx] > exon_limits[exon_idx][1]:
        exon_idx += 1
    else:
        exonic += 1
        snp_idx += 1

non_exonic = snp_l - exonic

答案 1 :(得分:0)

回答你的问题:有两个命令可以打破循环。 continue将继续使用下一个元素,break将离开整个循环。两者都只适用于最内循环。

此外,您应该使用树状结构,而不是循环遍历范围列表,这样可以轻松找到与该值匹配的范围。