2013-04-05 1 views
5

私は遺伝子サインを作成しようとしています。私はDNA配列の完全なテキストファイルを持っています。私はテキストファイルから各行を読みたい。次に、4塩基である4merを辞書に加える。たとえば :サンプルシーケンスPythonを使用してテキストファイルの行にスプライシング

ATGATATATCTATCAT 4mersを添加しながら、ちょうど1インクリメントID年代と辞書に... ATGA、TGAT、GATA、などである私が追加したい

ので辞書が開催されます...ここで

Genetic signatures, ID 
ATGA,1 
TGAT, 2 
GATA,3 

は、私がこれまでに...ここで

import sys 

def main(): 
    readingFile = open("signatures.txt", "r") 
    my_DNA="" 

    DNAseq = {} #creates dictionary 

    for char in readingFile: 
     my_DNA = my_DNA+char 

    for char in my_DNA:    
     index = 0 
     DnaID=1 
     seq = my_DNA[index:index+4]   

     if (DNAseq.has_key(seq)): #checks if the key is in the dictionary 
      index= index +1 
     else : 
      DNAseq[seq] = DnaID 
      index = index+1 
      DnaID= DnaID+1 

    readingFile.close() 

if __name__ == '__main__': 
    main() 

は私出力されたものです:

ACTC 
ACTC 
ACTC 
ACTC 
ACTC 
ACTC 

この出力それは文字列の各文字を反復していないことを示唆しています...助けてください!

答えて

6

あなたがそうでなければ、彼らはすべてのループ反復をリセットされます、ループの前にあなたのindexDnaID宣言を移動する必要があります。

index = 0 
DnaID=1 
for char in my_DNA:    
    #... rest of loop here 

あなたがその変更を行ったら、あなたはこの出力を持つことになります。

ATGA 1 
TGAT 2 
GATA 3 
ATAT 4 
TATA 5 
ATAT 6 
TATC 6 
ATCT 7 
TCTA 8 
CTAT 9 
TATC 10 
ATCA 10 
TCAT 11 
CAT 12 
AT 13 
T 14 

正しい長さでない最後の3つのアイテムを避けるために、ループを変更することができます:

for i in range(len(my_DNA)-3): 
    #... rest of loop here 

これは出力作る最後の3つの文字をループ、しません:

ATGA 1 
TGAT 2 
GATA 3 
ATAT 4 
TATA 5 
ATAT 6 
TATC 6 
ATCT 7 
TCTA 8 
CTAT 9 
TATC 10 
ATCA 10 
TCAT 11 
+0

Muchas gracias!ありがとうたくさんのロック! – brooklynchick

1

indexfor char in my_DNA:で始まるループを0にするたびにリセットされています。

また、ループの条件はループ本体と一致するようにwhile index < len(my_DNA)-4:のようにする必要があります。

+0

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

+0

@brooklynchick:喜んで助けてください。私は、あなたがそれを受け入れたことを示すために、最も役に立つと思われる答えを選択し、その答えをチェックすることをお勧めします。あなたが確信していれば、それは私にとって最も完全であると思われるので、私はc4pの答えを示唆したいと思います。 – Simon

+0

ありがとうサイモン。私はどのようにチェックするのですか?私がstackoverflowに関する質問をしたのはこれが初めてです。 – brooklynchick

1

索引カウンタは、forループ内にあるため、リセットされます。

もう少しお勧めしますか?私の解決策は次のようになります:

readingFile = open("signatures.txt", "r") 
my_DNA="" 

DNAseq = {} #creates dictionary 

for line in readingFile:  
    line = line.strip() 
    my_DNA = my_DNA + line 

ID = 1 
index = 0 
while True: 

    try: 
     seq = my_DNA[index:index+4] 
     if not seq in my_DNA: 
      DNAseq[ID] = my_DNA[index:index+4] 
     index += 4 
     ID += 1 
    except IndexError: 
     break 

readingFile.close() 

しかし、重複で何をしたいですか?たとえば、ATGCのようなシーケンスが2回表示される場合は、両方とも別のIDで追加する必要があります(例:{...1:'ATGC', ... 200:'ATGC',...})。

+0

私はそれを働かせてくれてありがとう..シンプルなソリューション.. @ブルーウッド...私はディクショナリのシーケンス(キー)をチェックするif else文を含んでいます。もしそれが既に入っているなら、私はそれを辞書。それが辞書にない場合は、私はそれを追加します – brooklynchick

+0

あなたのwhileループは本当ですか?それは条件ではないでしょうか? – brooklynchick

+0

これは、可変長のものとwhileループがforループよりも実行可能なように思えるかもしれないものをループする良い方法だと思います。この場合、ループは最後の可能な4merまで実行されます –

0

私が正しく理解していれば、4塩基の連続した文字列がどのくらいの頻度で出現するかを数えていますか?唯一の "ATGATATATCTATCAT" を含むファイルに

def split_to_4mers(filename): 
    dna_dict = {} 
    with open(filename, 'r') as f: 
     # assuming the first line of the file, only, contains the dna string 
     dna_string = f.readline(); 
     for idx in range(len(dna_string)-3): 
      seq = dna_string[idx:idx+4] 
      count = dna_dict.get(seq, 0) 
      dna_dict[seq] = count+1 
    return dna_dict 

出力:これを試してみてください

{'TGAT': 1, 'ATCT': 1, 'ATGA': 1, 'TCAT': 1, 'TATA': 1, 'TATC': 2, 'CTAT': 1, 'ATCA': 1, 'ATAT': 2, 'GATA': 1, 'TCTA': 1} 
+0

ありがとう、私はそれに取り組んでいただきありがとうございます:) – brooklynchick

2

これはあなたに所望の効果を与える必要があります。

from collections import defaultdict 

readingFile = open("signatures.txt", "r").read() 
DNAseq  = defaultdict(int) 
window  = 4 

for i in xrange(len(readingFile)): 
    current_4mer = readingFile[i:i+window] 
    if len(current_4mer) == window: 
     DNAseq[current_4mer] += 1 

print DNAseq 
関連する問題