以下是代码:
for x in range(1,15):
flag = 0
for b in range (1,15):
if tagname1[x]== tagname2[b]:
flag = 1
if int(aapos1[b]) <= int(aapos[x])<= int(aapos2[b]):
snps = snps + 1
elif int(synonymous[x]) == 0:
nonsyn2 = nonsyn2 + 1
break
elif int(synonymous[x]) == 1:
syn2 = syn2 + 1
break
if flag == 0:
if int(synonymous[x]) == 0:
nonsyn2 = nonsyn2 + 1
break
elif int(synonymous[x]) == 1:
syn2 = syn2 + 1
**break**
当我打印snps的值时,我最终得到的值为0,但情况并非如此。我自己查看数据并且它应该产生3的值。如果我擦除我加粗的最后一个'break'操作符,那么它工作正常,但是最后一次中断需要在那里为我获取syn2的正确值而且我不确定为什么在那里休息会影响前面的循环工作正常。可以建议我可能做错了什么以及如何解决这个问题?
Aapos是文件#1中的值.Aapos1和aapos2是文件#2中的2个值,因此在代码中,我正在检查文件1中的给定标记名是否与该标记名关联的aapos编号是否下降在aapos1和aapos2之间(假设文件#1中的标记名等于文件#2,由第一个if语句设置)。因此,对于文件#1(标记名(x))中的每个标记名,我希望程序遍历文件#2中的每个标记名,并查看是否满足我设置的两个标准(通过前两个if语句)。如果是这样,那么我想要snp + 1.但由于某种原因,程序没有遍历文件#2中的每个标记名,它只是迭代第一个。我测试了这个。所以,我的猜测是最后一个break语句的定位导致了这个问题,因为一旦我删除它,它就可以了。但是,我不明白为什么最后一次破坏声明会成为这个问题的原因。
谢谢!
答案 0 :(得分:0)
查看内循环的迭代。它取决于synonymous [x]的值...不包括在内,但我猜它是1或0。
所以... flag = 0。
如果标签匹配...设置标志1,检查您的计数条件,然后检查syn [x]并中断任一方式。
如果标签不匹配...检查syn [x]并以任何方式中断。
循环通过内循环有5种可能的结果......其中4种导致破坏循环。要么你在第一次尝试时匹配,要么你打破。我不太了解你解决这个问题的逻辑,但我很确定这不是你想要的。
修改
你想要这样的东西......
for x in range(1,15):
for y in range(1,15):
if tag1 == tag2:
snps += 1
if syn == 0:
something
elif syn == 1:
something else