2016-09-15 25 views
0

イムはテキストファイルのシーケンスからジーンカウントと頻度を見つけようとしていますが、私のコードでは1つのヌクレオチドカウントしか出力していません。ジヌクレオチドカウントと頻度

e = "ecoli.txt" 

ecnt = {} 

with open(e) as seq: 
    for line in seq: 
     for word in line.split(): 
      for i in range(len(seqr)): 
       dinuc = (seqr[i] + seqr[i:i+2]) 
       for dinuc in seqr: 
        if dinuc in ecnt: 
         ecnt[dinuc] += 1 
        else: 
         ecnt[dinuc] = 1 

for x,y in ecnt.items(): 
    print(x, y) 

サンプル入力: "AAATTTCGTCGTTGCCC"

サンプル出力: AA:2 TT:3 TC:2 CG:2 GT:2 GC:1 CC:2

今、私の出力のための単一のヌクレオチドを得るだけ:

C 83550600 A 60342100 T 88192300 G 92834000

すなわち「AAA」を繰り返しヌクレオチドについて、カウントが連続した「AA」のすべての可能な組み合わせを返すために持って、出力が2ではなく1でなければなりませんので、それはどのような順序をdoesntのジヌクレオチドが列挙されていれば、私はすべての組み合わせが必要で、コードが繰り返しヌクレオチドの正確な数を返す必要があります。私はTAを求めていましたが、私の唯一の問題は、私の辞書にジヌクレオチドを追加するための 'for'ループを得ることでした。私の範囲は間違っているかもしれないし、間違っていないかもしれないと思います。ファイルは本当に大きなものなので、シーケンスは行に分割されます。

ありがとうございました!

+1

はサンプル入力の短いセクションと対応する所望の出力を表示します。 – John1024

+0

'seqr'とは何ですか?あなたが投稿したスニペットに定義されていません –

+0

あなたのコードは多くの点で壊れています。 'seqr'とは何ですか?なぜline.split()内の単語のためにスペースを空白で分割したのですか?それはDNA配列などではありませんか?改行記号は削除しません。 –

答えて

0

私はあなたのコードを見て、あなたが見たいかもしれないいくつかのものを見つけました。このファイルは、500個のヌクレオチドの単一配列を有する

import random 
def write_random_sequence(): 
    out_file = open("ecoli.txt", "w") 
    num_nts = 500 
    nts_per_line = 80 
    nts = [] 
    for i in range(num_nts): 
     nt = random.choice(["A", "T", "C", "G"]) 
     nts.append(nt) 
    lines = [nts[i:i+nts_per_line] for i in range(0, len(nts), nts_per_line)] 
    for line in lines: 
     out_file.write("".join(line) + "\n") 
    out_file.close() 
write_random_sequence() 

お知らせこと:私はecoli.txtを持っていなかったので、私は次の関数でランダムなヌクレオチドと私自身のいずれかを生成し、私の解決策をテストするための

それぞれ80ヌクレオチドのラインに分離した。ある行の最初のヌクレオチドと次の行の最初の2番目のヌクレオチドを持つジヌクレオチドを数えるには、これらの別々の行すべてをスペースなしで1つの文字列にマージする必要があります。

seq = "" 
with open("ecoli.txt", "r") as seq_data: 
    for line in seq_data: 
     seq += line.strip() 

「SEQ」をプリントアウトしてみて、それが全てのヌクレオチドを含む1つの巨大な文字列でなければならないことがわかりますのは、最初のことをやってみましょう。次に、配列の中のジヌクレオチドを見つける必要があります。私たちはあなたが試してみたスライスを使ってこれを行うことができます。したがって、文字列内の各位置について、現在のヌクレオチドとそれに続くヌクレオチドの両方を調べます。私たちは、その後、非常にあなたのような辞書「ECNT」でヌクレオチドおよびそれらのストレージのカウントを行うことができます

for i in range(len(seq)-1):#note the -1 
    dinuc = seq[i:i+2] 

を持っていました。最終的なコードは次のようになります。

ecnt = {} 
seq = "" 
with open("ecoli.txt", "r") as seq_data: 
    for line in seq_data: 
     seq += line.strip() 
for i in range(len(seq)-1): 
    dinuc = seq[i:i+2] 
    if dinuc in ecnt: 
     ecnt[dinuc] += 1 
    else: 
     ecnt[dinuc] = 1 
print ecnt 
0

defaultdict使用するのに最適な機会:

from collections import defaultdict 

file_name = "ecoli.txt" 

dinucleotide_counts = defaultdict(int) 

sequence = "" 

with open(file_name) as file: 
    for line in file: 
     sequence += line.strip() 

for i in range(len(sequence) - 1): 
    dinucleotide_counts[sequence[i:i + 2]] += 1 

for key, value in sorted(dinucleotide_counts.items()): 
    print(key, value) 
関連する問題