我认为解释我的困境的最好方法是举个例子。假设我有一个包含此信息的文件:
isoform snp_rein
NM_005101 97
NM_005101 144
NM_198576 20790
和一个看起来如此的字典:
exons = {'NM_005101': [(0, 110), (517, 1073)], 'NM_198576': [(0, 251), (2078, 2340), (15154, 15202), (20542, 20758), (21050, 21275), (21355, 21580), (21833, 22040), (23116, 23335), (23415, 23610), (23700, 23901), (23986, 24135), (24211, 24317), (25038, 25155), (25236, 25401), (25610, 25754), (25841, 25966), (26037, 26143), (26274, 26613), (26697, 26835), (27204, 27332), (27450, 27565), (27653, 27773), (27889, 28243), (28744, 28937), (29113, 29329), (29443, 29673), (29780, 29915), (30110, 30207), (30304, 30469), (30603, 30715), (31130, 31247), (31330, 31523), (31605, 31693), (33630, 33855), (34325, 34429), (34701, 35997)]}
我一直在研究一些代码,找出snp_rein
数字所在的数字对。然后,我能够计算第一组数字的最大值与第二组数字的最小值之间的差异,依此类推。我的代码如下:
totalintron=0
if name in exons:
y = exons[name]
for sd, i in enumerate(exons[name]):
if snpos<=max(i):
exonnumber = sd+1
position = sd
print exonnumber
break
for index in range(len(y) -1):
first_max = max(y[index])
second_min = min(y[index + 1])
intron = second_min - first_max
print intron
totalintron = totalintron + intron
print totalintron
totalintron = 0
我的输出如下:( **x**
表示exonnumber
,最后一个数字表示我想要更改的总数):
**1**
407
407
**2**
407
407
**5**
1827
12814
5340
292
80
253
1076
80
90
85
76
721
81
209
87
71
131
84
369
118
88
116
501
176
114
107
195
97
134
415
83
82
1937
470
272
28671
我的问题在于总数。我想只计算exonnumber指定的数字量。对于第一个输出,我希望总数读为0,因为测试的数字在外显子1的指定范围内。对于第二个输出,我希望总数读取407因为它在外显子2中。对于最后一个输出,我想要将前4个数字相加,因为测试数字在外显子5中。
这就是我希望输出看起来像:
**1**
0
**2**
407
**5**
20273
如果有意义的话,有关如何改变总计达到指定数量的总数的建议吗?请解释一下你的建议,因为我是python的新手......
答案 0 :(得分:1)
你希望最后一个内部循环看起来像这样:
# reset the `totalintron` for the current `exonnumber`
totalintron = 0
# only iterate `exonnumber - 1` (which is guaranteed to be len(y) - 1 at max)
for index in range(exonnumber - 1):
first_max = max(y[index])
second_min = min(y[index + 1])
intron = second_min - first_max
# don’t print `intron`, we only care about the total
totalintron = totalintron + intron
print totalintron