2013-10-23 82 views
0

我之前曾問過類似的問題,但是在解決一些以前的問題之後,我遇到了稍微不同的問題:爲什麼循環不能按預期運行?詳情如下:

有兩個txt文件的結構類似於列。文件1具有以下列:tagname1,aapos,synonymous;並且文件2具有以下內容:tagname2,aapos1,aapos2。我想要做的是將文件1中的每個標記名1與文件2中的每個標記名2進行比較,並查看它們是否匹配。對於每一場比賽,我都希望程序檢查與特定標記名1對應的aapos值是否落在aapos1和aapos2之間,正如我的第二條if語句所述。如果在遍歷全部文件2後無法找到aapos的匹配項,那麼我是否希望執行以下if語句並檢查文件1中的同義詞是否等於0或1,並將1添加到syn2或nonsyn2 ,視情況而定。如果對於特定的標記名1,則程序會遍歷文件2中的標記名2的整個列表,並且無法找到匹配。

但是,根據我的代碼,程序只運行一次,我得到的值爲1,sns和nonsyn2的值爲1。我不確定爲什麼會出現這種情況。

在範圍(1,15)X:

flag = 0 
    snps = 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 


    if snps == 0: 
     if int(synonymous[x]) == 0: 

      nonsyn2 = nonsyn2 + 1 

     elif int(synonymous[x]) == 1: 

      syn2 = syn2 + 1  

    elif flag == 0: 

     if int(synonymous[x]) == 0: 

      nonsyn2 = nonsyn2 + 1 

     elif int(synonymous[x]) == 1: 

      syn2 = syn2 + 1 
+0

請格式化您的代碼。很難閱讀發佈。 – DanielSank

回答

2

你確定你的意思是在較低的if語句來打破?

如:

if int(synonymous[x]) == 0: 

     nonsyn2 = nonsyn2 + 1 
     break 

這些中的第一個for循環(對於x範圍內(1,15):)因此,如果其中一個條件得到滿足,你將退出循環。

如果這種情況發生在您的第一個循環上,可能是您只看到它運行一次的原因。

我不完全確定我明白你想要做什麼,但關鍵字'繼續'可能是你想要的。它會使程序進入循環的下一次迭代。

+0

您可能還需要在循環開始時重置'snps',就像您做'flag'一樣 - 我不確定這是否應該爲您的第一個文件中的不同條目積累。現在它會。 –

+0

我認爲你倆都是對的。我做了以下更改,但還有另一個問題。由前兩個if語句設置的標準的第一個匹配是值爲12.因此,當我將範圍設置爲低於12的任何值時,我將獲得nonsyn2和syn2的值,這將加起來達到我的上限範圍,如預期/預期。然而,只要我將範圍增加到12或13,在這一點上它確實找到了一個匹配,我爲syn2和nonsyn2獲得的數字的總和加上它找到的匹配不會達到上限限制我的範圍。 – bioprogrammer

+0

您是否嘗試刪除所有中斷和繼續關鍵字。現在我再看看,我認爲不需要。 – joeButler

相關問題