2013-10-22 93 views
-1

這是我正在做的事:爲什麼這個循環不能正常工作? (Python)

有兩個文件,我比較。

因此,有兩個文件包含與該突變相關的突變名稱和編號爲aapos的編號。

在文件1中,有t個突變和在文件2中,有s個突變。

現在,文件編號2中的突變具有特定的生物學意義,所以我試圖做的是查看文件1中的突變名稱(在我的程序中稱爲tagname)是否等同於文件2中的標記名,以及該特定突變的aapos數是否落入文件編號2中的aapos1和aapos2的範圍內。

如果滿足這兩個條件,那麼文件1中的突變具有特殊的生物學意義,讓我們打電話它屬於第1類,否則它屬於第2類,這沒有生物學意義。

此外,在這些文件中,有一個名爲synonymous列和文件各1突變,同義列分配若干0或1

現在,這是我想做的對於屬於CATEGORY 2的每個突變,如果該突變的synonymous列爲0,我希望計數器nonsyntwo加1,如果它是1,那麼我希望計數器syntwo加1.實質上,對於所有屬於類別2的突變,我想要在synonymous列中有多少具有指定值0的計數以及具有指定值1的有多少個。

但是,當程序運行時,我最終得到一個nonsyntwosyntwo的數字,這比我正在使用的文件中的標記名的數量要多得多。如果我要將st更改爲15(每個文件中有成千上萬的標記名),那麼我將得到94作爲nonsyntwo的值。

如果程序迭代了15個標記名,這怎麼可能?

for x in range(1,s): 
    for b in range (1,t): 
     if tagname1[x]== tagname2[b]: 
      if int(aapos1[b]) <= int(aapos[x])<= int(aapos2[b]): 
       snps = snps + 1 
      elif int(synonymous[x]) == 0: 
       nonsyntwo = nonsyntwo + 1 
      elif int(synonymous[x]) == 1: 
       syntwo = syntwo + 1 
     elif tagname1[x]!= tagname2[b]: 
      if int(synonymous[x]) == 0: 
       nonsyntwo = nonsyntwo + 1 
      elif int(synonymous[x]) == 1: 
       syntwo = syntwo + 1 
+2

您意識到在範圍(1,s):for範圍(1,t):...中的x for x的代碼正在運行(s -1)\ *(t-1)次,而不是s + t,對嗎? – jwodder

+0

是的,我知道。 – bioprogrammer

+1

那麼爲什麼當's'和't'是15令人驚訝時'nonsyntwo'的值爲94? – jwodder

回答

0

我不完全理解你想要做什麼,當我開始命名hypotheticals就一發不可收拾,但是這是你的問題:

elif tagname1[x]!= tagname2[b]: 
     if int(synonymous[x]) == 0: 
      nonsyntwo = nonsyntwo + 1 
     elif int(synonymous[x]) == 1: 
      syntwo = syntwo + 1 

這將運行每對x,b。這意味着它將至少執行(s-2)(t-2)次。我懷疑這不是你想要的。

0

你真的需要清楚地說明你的問題。我們不應該通過你的問題來理解你正在處理的是什麼。

我瞭解以下內容:

因此,有包含突變和一個數字, 稱爲aapos,與突變相關的名字兩個文件。 [...] 另外,在每個這些文件中,都有一個名爲'synonymous'的列[...]] aapos1和aapos2的範圍內 文件號2

  1. 你有兩個文件。
  2. 第一個文件有三列:tagname, appos, synonymous
  3. 第二個文件有四列:tagname, aapos, appos2, synonymous

現在,文件號2突變有一個特定的生物 signifiance,所以我想要做的就是看文件1突變名稱 (在我的節目叫標記名)是否等於到文件2中的標記名稱 ,以及該特定突變的aapos編號是否落入文件編號2中的apos1和apos2的範圍內。[012] 如果滿足這兩個條件,那麼我在文件1具有特殊的生物學意義,我們稱之爲類別1

  1. 您要檢查file2中的每一行,如果第一列相匹配,在文件1
  2. 如果匹配,如果第二列withing第二和第三列的量程file2中,你想將該行添加到名爲category1的集合中;否則添加到另一個名爲category2的集合。
在這些文件中的

,有一個名爲列「的代名詞」和 文件1各突變,同義列分配一些 0或1。現在,這是我想要的要做到:對於屬於第2類的 的每個突變,如果該突變的「同義」列爲0,則I 希望計數器'nonsyntwo'加1,如果它是1,那麼我想要 計數器'合成'添加1.

  1. category2集合中取出每個項目,並計數1和0的數量。

如果這是正確的,那麼以下是你所需要的(假設你的文件用逗號分隔)

import csv 
from collections import Counter 

with open('file1.txt') as f: 
    reader = csv.reader(f, delimiter=',') 
    file1 = list(reader) 

with open('file2.txt') as f: 
    reader = csv.reader(f, delimiter=',') 
    file2 = list(reader) 

cat1 = [] 
cat2 = [] 

for line in file2: 
    for line2 in file1: 
     if line[0] == line2[0]: 
      if int(line2[1]) <= int(line[1]) <= int(line2[2]): 
       cat1.append(line) 
      else: 
       cat2.append(line) 

counter = Counter(line[3] for line in cat2) 
nonsyntwo = counter['0'] 
syntwo = counter['1'] 
+0

我試過這個,但是由於某種原因,循環不工作。當我嘗試打印cat1或cat2時,它只顯示空白列表爲[]。 – bioprogrammer

0

我不明白你的問題的本質。但是,我有這些改進建議:

aapos = map(int, appos) 
aapos1 = map(int, appos1) 
aapos2 = map(int, appos2) 
synonyms = map(int, synonyms) # or are they already? 
for x in range(1,s): 
    for b in range (1,t): 
     # Here, x and b go from 1 to s resp t. 
     # So you are always missing [0] of the array. 
     # Doing 
     x, b = x-1, b-1 
     # is not very clean, but it helps for now. 
     checksyn = True 
     if tagname1[x] == tagname2[b]: 
      if aapos1[b] <= aapos[x] <= aapos2[b]: 
       snps += 1 
       checksyn = False 
     if checksyn: 
      if synonymous[x] == 0: 
       nonsyntwo += 1 
      elif synonymous[x] == 1: # if 1 is the only other possible value, an else: would be enough here. 
       syntwo += 1 
+0

我嘗試了它的伴侶,但是對於syntwo和nonsyntwo,我都得到0的值。如果我輸入打印checksyn,那麼我會得到「True」,但由於某些原因,其餘的if語句不起作用。 – bioprogrammer

相關問題