2016-04-06 22 views
1

我試圖寫一個函數來計算髮生在這個文件中的每個序列號的數量(這是一個樣本爆炸文件)創建一個字典來計數序列ID的出現的次數

enter image description here

上面的圖片是我正在處理的輸入文件。

def count_seq(input): 
    dic1={} 
    count=0 
    for line in input: 
     if line.startswith('#'): 
     continue 
    if line.find('hits found'): 
     line=line.split('\t') 
     if line[1] in dic1: 
      dic1[line]+=1 
     else: 
      dic1[line]=1 
return dic1 

以上是我的代碼,調用時只返回空括號{}

所以我想指望有多少次出現每個序列ID的(最後13行第二個元素),例如: FO203510.1發生4次。

任何幫助將不勝感激,謝謝!

+0

文字在這裏比圖片更受歡迎。人們喜歡複製/粘貼並測試您的數據解決方案。 – jDo

+0

哦,對,謝謝你讓我知道,我沒有想到這一點,並沒有意識到這會是一個問題! – pythonbeginner2506

回答

2

也許這就是你追求的:

def count_seq(input_file): 
    dic1={} 
    with open(input_file, "r") as f: 
     for line in f: 
      line = line.strip() 
      if not line.startswith('#'): 
       line = line.split() 
       seq_id = line[1] 
       if not seq_id in dic1: 
        dic1[seq_id] = 1 
       else: 
        dic1[seq_id] += 1 

    return dic1 

print(count_seq("blast_file")) 
+0

這就是我想要做的,謝謝!仍圍繞着循環和字典讓我的頭腦! – pythonbeginner2506

2

這是collections.defaultdict一個合適的情況下。假設f是文件對象。假設這些序列在第二列中,那麼只有幾行代碼如圖所示。

from collections import defaultdict 
d = defaultdict(int) 
seqs = (line.split()[1] for line in f if not line.strip().startswith("#")) 
for seq in seqs: 
    d[seq] += 1 

看看它是否有效!

相關問題