计算的结果和大家差太多,晚上回来重新看了一遍,发现我没有注意range区间的开闭,所以每个外显子都少算了有一位,把这一位加上之后,长度还是差很多。用群里小伙伴的代码,在自己电脑上试了一下,发现我之前计算的外显子个数少了大概1/3.重新下载了文件,计算,结果就差不多了。
    之前的文件,是直接用finalshell上传的,估计,some how,没传完整。
    修改arange区间

    1. for i in range(len(genom_exon)):
    2. print(i)
    3. #i = 14
    4. base_pool_i = []
    5. data_chrom = genom_exon[i]
    6. for i in range(len(data_chrom)):
    7. #print(i)
    8. if re.match('^d',data_chrom[i]) or re.match('^e',data_chrom[i]):
    9. pass
    10. else:
    11. exon_i = data_chrom[i].split('#')[0].split('-')
    12. print(exon_i)
    13. exon_temp = [int(x) for x in exon_i]
    14. if len(exon_temp) < 2:
    15. base_i = set(exon_temp)
    16. base_pool_i.append(base_i)
    17. else:
    18. base_temp = np.arange(exon_temp[0],exon_temp[1]+1)
    19. base_i = set(base_temp)
    20. base_pool_i.append(base_i) ## append set 运算非常快
    21. genome_base.append(base_pool_i)
    22. ## 最终计算结果:35365900 就对啦

    此外附上两位小伙伴的代码, 比我写的好太多。

    1. import re
    2. chr_pos = set()#定义set数据,目的去重
    3. exon_list = []
    4. with open("CCDS.current.txt", 'r') as file:
    5. for line in file:
    6. if re.match('^#',line):
    7. continue #跳过首行
    8. line = line.split("\t")
    9. if line[9] != "-":#pass掉第10列为"-"的数据行
    10. chr = line[0] #获得该行数据的染色体编号
    11. exons = line[9].lstrip("[").rstrip("]").split(", ") #去掉字符串[],以", "切割字符串,得到exons列表
    12. for exon in exons:#对切割得到的exons列表进行循环
    13. if re.match('^c',exon):
    14. continue
    15. exon=exon.split("#")[0].split('-')
    16. exon_list.append(exon)
    17. # print(exon)
    18. if len(exon) ==1:
    19. continue
    20. for i in range(int(exon[0]),int(exon[1])+1):
    21. chr_pos.add(line[0]+":"+str(i))#依据染色体号:外显子坐标,利用set数据去重
    22. print(len(chr_pos))
    23. ## 结果:35185772
    24. ## len(exon_list) 499022

    另一个

    1. base_pos = set() ## 以集合来存储所有非重复位置位置
    2. with open("./CCDS.current.txt", "r") as f:
    3. for line in f:
    4. if line.startswith("#"): ## 跳过首行
    5. continue
    6. items = line.split("\t") ## 以\t 分割每一行
    7. if items[9] != "-": ## 第10行exon列表类似 “[26064-26224, 26564-26595]”,有些是 “-” 跳过
    8. chrN = items[0]
    9. exon_ls = items[9][1:-1].split(",")
    10. for exon in exon_ls:
    11. s, e = exon.split("-")
    12. exon_pos = {f"{chrN}:{i}" for i in range(int(s), int(e)+1)}
    13. base_pos.update(exon_pos)
    14. print("总长: ", len(base_pos))

    What I learned:

    1. set 的 add 和update用法
    2. 对于set这种数据结构,一个个向里面扔元素比取并集要快
    3. 读入数据的方法: read(),readlines(),read(size)
    4. 有的时候一行行读入,处理,比一次性全读入再处理要快
    5. numpy中flatten()的用法
    6. KISS: keep it simple, stupid!