计算的结果和大家差太多,晚上回来重新看了一遍,发现我没有注意range区间的开闭,所以每个外显子都少算了有一位,把这一位加上之后,长度还是差很多。用群里小伙伴的代码,在自己电脑上试了一下,发现我之前计算的外显子个数少了大概1/3.重新下载了文件,计算,结果就差不多了。
之前的文件,是直接用finalshell上传的,估计,some how,没传完整。
修改arange区间
for i in range(len(genom_exon)):print(i)#i = 14base_pool_i = []data_chrom = genom_exon[i]for i in range(len(data_chrom)):#print(i)if re.match('^d',data_chrom[i]) or re.match('^e',data_chrom[i]):passelse:exon_i = data_chrom[i].split('#')[0].split('-')print(exon_i)exon_temp = [int(x) for x in exon_i]if len(exon_temp) < 2:base_i = set(exon_temp)base_pool_i.append(base_i)else:base_temp = np.arange(exon_temp[0],exon_temp[1]+1)base_i = set(base_temp)base_pool_i.append(base_i) ## append set 运算非常快genome_base.append(base_pool_i)## 最终计算结果:35365900 就对啦
此外附上两位小伙伴的代码, 比我写的好太多。
import rechr_pos = set()#定义set数据,目的去重exon_list = []with open("CCDS.current.txt", 'r') as file:for line in file:if re.match('^#',line):continue #跳过首行line = line.split("\t")if line[9] != "-":#pass掉第10列为"-"的数据行chr = line[0] #获得该行数据的染色体编号exons = line[9].lstrip("[").rstrip("]").split(", ") #去掉字符串[],以", "切割字符串,得到exons列表for exon in exons:#对切割得到的exons列表进行循环if re.match('^c',exon):continueexon=exon.split("#")[0].split('-')exon_list.append(exon)# print(exon)if len(exon) ==1:continuefor i in range(int(exon[0]),int(exon[1])+1):chr_pos.add(line[0]+":"+str(i))#依据染色体号:外显子坐标,利用set数据去重print(len(chr_pos))## 结果:35185772## len(exon_list) 499022
另一个
base_pos = set() ## 以集合来存储所有非重复位置位置with open("./CCDS.current.txt", "r") as f:for line in f:if line.startswith("#"): ## 跳过首行continueitems = line.split("\t") ## 以\t 分割每一行if items[9] != "-": ## 第10行exon列表类似 “[26064-26224, 26564-26595]”,有些是 “-” 跳过chrN = items[0]exon_ls = items[9][1:-1].split(",")for exon in exon_ls:s, e = exon.split("-")exon_pos = {f"{chrN}:{i}" for i in range(int(s), int(e)+1)}base_pos.update(exon_pos)print("总长: ", len(base_pos))
What I learned:
- set 的 add 和update用法
- 对于set这种数据结构,一个个向里面扔元素比取并集要快
- 读入数据的方法: read(),readlines(),read(size)
- 有的时候一行行读入,处理,比一次性全读入再处理要快
- numpy中flatten()的用法
- KISS: keep it simple, stupid!
